Use full txn struct instead of just txn ID

Move from dealing with just transaction ID to using the full transaction
struct in write intents and in request / response headers.

Cleaned up some code in MVCC that was unnecessarily complex and introduced
concept of transaction epochs for Put() and for ResolveIntent(). Transaction
epochs start at 0 and are incremented every time a transaction is retried.
Transactions are retried (instead of aborted) in the event that a value is
encountered within the "window of uncertainty" between RequestHeader.Timestamp
and RequestHeader.MaxTimestamp, or in the case of an SSI transaction, if
the final transaction timestamp is not equal to the initial transaction
timestamp.

Typically, when a transaction has to restart, it covers all of the same
keys on writes and increments the intents' epochs accordingly. However,
if there's conditional logic in the transaction, it might end up skipping
some keys which were written the previous run--those earlier intents should
then not be committed when the intents are resolved after txn commit.
It makes me nervous to make the Transaction non-opaque to clients; this could be an obstacle to future changes to the struct.  What if we make EndTransactionRequest take a list of Transactions, and require that each ResponseHeader.Txn must be passed back to the server (either in some RequestHeader that trades it in for a new Transaction in the response, or in the final EndTransactionRequest).  We could retain the "use the maximum timestamp" rule as a heuristic when applications have multiple Transactions to choose from, but it would no longer be required for correctness.