When a miner solves the nonce value, is that the proof of work
Yes.
The miner keeps trying new nonce values until they find one such that hashing the 80 byte block header results in a value that is less than the current difficulty target value. The fact that the block header (which includes the nonce) hashes to a value that is lower than the target is proof that they have completed the necessary work.
You the man, Danny Ham!
Seriously though, your responses have been really to the point and helpful for noobs like me.
BTW, how can you run out of nonce values? Can't you just continue incrementing the number, or are you talking about the fact that a integer (or whatever the data type is) has a numeric limit?
You also said
Then they build a merkle tree from the chosen transactions and calculate the merkle root.
I'm curious if they mix up the routine to build this tree, as I would have just assumed it's a built-in function call in the software: like "BuildMerkleTree(transactions)" (where transactions is the list of selected transactions). I guess I'm curious as to how this tree is built. Wondering if there are any performance advantages (ie speed) to building it in a certain way versus using a canned function.