So the transactions on the network are all propagated through the miners in a peer-to-peer fashion, with each miner including his or her coinbase transaction after the tree root?
Correct. Although it is probably better to just think of the coinbase tx as another tx.
When a node receives a new transaction it:
a) verifies the inputs haven't been previously spent
b) verifies the signature on the transaction is valid (signed by the private key(s) of the inputs)
c) verifies this transaction isn't already included in a block.
All (full) nodes have a complete copy of the blockchain and thus all confirmed transactions. So it is important for a node to have an accurate record of all (known) unconfirmed transactions. This is called the memory pool.
When a node validates a new transaction it adds it to the memory pool.
When a block is validated the block is added to the blockchain and the transactions in the block are removed from the memory pool.
When a block is orphaned the transactions in the block are added to the memory pool (many or all may be removed again if they replacing block also contains them).
This way all nodes have a set of transactions they are aware of which haven't yet been included in a block as well as all known blocks and the chain which is currently the "longest".
Is there anything that stops miners from excluding transactions that they don't want going through the network when they mint blocks?
No. That is intentional. Miners are free to choose which tx then want to include in any particular block. Miners can't force users to include a fee but they can choose to exclude low paying or non-paying transactions. Users on the other hand aren't guaranteed inclusion in the block but can't be forced to include a fee. The mining "economy" will meet in the middle. Currently subsidies make the overwhelming portion of miner compensation but overtime fees will become more important.