Sanitized use of MVCC keys throughout the storage layer

Also documented MVCC design decisions.
The interaction between the ts and isValue computed outside the loop for keys[0] and this one computed inside (but after the first use of isValue) is kind of odd; I would move the `if i == 0` block outside the loop and then loop over `range keys[1:]`. This way MVCCDecodeKey can be called at the beginning of the loop.