Simplify Transaction Implementation

Currently, model states are tracked twice: once on the model and once in the transaction "buckets". This results in un-necessary coupling between the model and it's transaction and adds a lot of complexity to the implementation. This PR simplifies things by calculating the commit details based on model state.

@wycats worried this would result in worse performance, however I don't believe that to be the case, as we already iterate over all records during commit (not to mention the number of models in a transaction is low-cardinality).

I expect this to make things simpler down the line, e.g. #539. It should also be noted that this makes transactions a little more flexible by allowing mutated records to be moved to a different transaction. Below is an actual use case for this behavior:

In our application, we have an `EditRoute` subclass that adds the model to a new transaction inside `setupControllers`. We would like to re-use the same logic when the model is newly created. To do this, however, we need to be able to move dirty records between transactions (specifically from the store's default transaction to the route's transaction).