As we discussed previously I'm not sure `riak_core_vnode` is the correct place to be doing this. As the PR states, the goal of this work is to limit folds over `riak_*kv*_vnode`'s. This registers a lock per-partition, per module so there is also a `{vnode_lock, riak_pipe_vnode, Partition}` for each partition for example. This may have the desired effect of also providing the locks for `riak_kv_vnode` but the scope is too wide. I'll leave some comments elsewhere to try and illustrate. 

It still seems to me that if we want to limit folds over `riak_kv_vnode` backends than `riak_kv` is the correct place to be registering these locks and acquiring them. The challenge is integrating that with handoff because handoff is a general mechanism in core and its hooks at the `riak_kv` level are insufficient for grabbing locks. The correct way is probably to extend these hooks but alas it is probably to late for that. As I previously expressed, I think we should skip handoff this go around because of these issues. Handoff can still be limited via the node-wide concurrency limit so provided exclusive access to the partition can be done via a mixture of two knobs instead of just one. I understand that handoff has been a large pain point and motivation for this work and that a more ideal approach is desired but we have to start being realistic about what we can get in with the time we have.

Without handoff this becomes a much simpler problem. Register the locks in `riak_kv_vnode` as `{riak_kv_vnode_lock, Partition}` and the Repl and AAE changes should basically remain the same. However, I really think the solution we should be discussing is doing locking across all [backend folds that use ?FOLD_REQ](https://github.com/basho/riak_kv/blob/develop/src/riak_kv_vnode.erl#L1564)