Implement and unittest EndTransaction.

Added an implementation for EndTransaction which attempts to move a
transaction from PENDING to either COMMITTED or ABORTED depending on
the EndTransactionRequest.Commit argument. Various error conditions
may result, including the txn already being committed or aborted,
Epoch or timestamp regressions, or transaction retry on SSI txns
in the event that the commit timestamp is different from the transaction
timestamp.
We actually have all of the information required during InternalPushTxn as well, by design. Recall that every intent stores the transaction struct now, not just the txnID. This allows us to proceed without a requirement that the txn record be written synchronously with the start of the transaction.