Nice article! Here's another type of failure with its solution:
* You want to register a domain name on the blockchain and associate it with your address, so you submit "register foo".
* The miner sees it, and inserts an earlier transaction registering foo to them instead.
Solution:
* You register the hash of foo, which registers the plaintext encoded by that hash, then wait until the transaction is accepted publicly and submit a second transaction that reveals to everyone the plaintext of the hash that you registered.
The miner could still try to guess at which name you're registering based on the hash (by having a long list of potential names to hash just in time), but I can't think of a way to do better than that. Anyone else?