We embed the txn's callback in the PrepareTxnMessage so that we can support multiple prepare invocations. RemoteTransaction.getPrepareCallback() creates a new RemotePrepareCallbacks each time
Refactored PartitionExecutor.finishDistributedTransaction() so that we can handle committing speculative txns either *before* or *after* we abort the dtxn. This prevents us from trying to commit txns that have a undoToken that is greater than the one we want to rollback for the dtxn
After thinking about it for a long time, I finally just went ahead and remove the HStoreObjectPool stuff. We still have a some independent object pools in the Markov estimation stuff that might be ok to keep around since it's short-lived...