Add checkpoints as a replacement for open-ended transactions

The `beginTransaction` method is causing big problems because it allows transactions to be left open. Nested transactions also behave unpredictably. For example, we use `beginTransaction` and `commitTransaction` in vim-mode to group multiple changes in insert mode. This conflicts with our use of `beginTransaction` and `abortTransaction` in the autocomplete to clear away transient changes that occurred when user toggled through completions after the menu is dismissed.

Checkpoints provide a much more controlled mechanism for addressing these two use cases. You can create a checkpoint at a desired state, then later either revert the buffer to the checkpoint (autocomplete) or group the changes since that checkpoint in a single transaction (vim-mode).