Restructure the data store.

 - Facades: Transaction and Data Store
 - Internal: Transaction is a stack of operations, DataStore is a stack of transactions.
 - When client code commits or rolls back transaction, facade forwards to real transaction, which tells the internal data store to apply the operations
 - Move the logic for each action into the operation so that we fully utilise polymorphism

All tests pass. But I'm quite certain the tests are insufficient...

You'll also need to add virtual dtors to the following classes:
 - You::DataStore::Internal::IOperation
 - You::DataStore::Internal::PostOperation
 - You::DataStore::Internal::PutOperation
 - You::DataStore::Internal::EraseOperation
I think I am starting to get the big picture here... So `Transaction` is a `shared_ptr<Internal::Transaction>`, that's why you can create a weak pointer out of it and pass it to the `transactionStack`.... And you must return it by value because otherwise it will become invalidated as soon as `begin()` ends.... The `weak_ptr` on the stack does not become invalidated because the `shared_ptr` is `move`d to the `Transaction` being constructed when this method is called....
Omg this is quite a lot to grasp...... Please tell me if there is anything wrong with my statement above