What stops a miner from including arbitrary transactions in their block? Suppose there is a miner who consistently cheats. That is, she will include "Alice sent me 100 bitcoins" in every block she creates. If she became the first miner to find a passable hash, then she would get 100 coins. This scenario is not impossible. How does the mining algorithm prevent this?
This isn't possible because every node in the network enforces the consensus rules. 

A miner is only allowed to include 1 transaction that moves coins with no previous inputs, which is the coinbase transaction. The output value of the coinbase transaction must not exceed the block reward plus any transaction fees from transactions in that block. If the value exceeds this amount, the block will be rejected by the network, and the miner loses the work they did to create it.

If the miner includes the "Alice sent me 100 bitcoin" tx by using previous outputs from Alice as inputs, they must be part of a valid transaction. That is to say, Alice must have signed those inputs to prove that she wants the BTC to be spent. If the miner includes them as unsigned inputs, the transaction is invalid, and any block they create including it is also invalid.