Add a pull mechanism for pre/post hooks

sync/2 is a push-pull mechanism (both pulls data from remote nodes and
then pushes its own updates). This makes it hard to deal with pre/post
hooks when they might be executing at once on multiple nodes, and the
control flow would be very complex.

To allow people to use pre and post hooks, a pull-only mechanism is
introduced, which allows instances to do their fetching caring only
about local node content. This implies that all node must pull from
remote ones, and simulating a push/pull with pulls only can be done by
looking at the diff result, sending a remote notification, etc.

The pre and post hooks are basic: the pre hook will be notified of what
the merge would look like (local wins, peer wins, or a conflict) along
with the values from both sides, can do whatever it wants, and return
`skip` or `ok` in order to cancel the pull for this value only, or keep
it going.

The post hook has no direct impact, and is therefore only informed of
the key and final value. No state is carried from the pre to post hook
at this time, and a post hook won't be called after a pre hook has
decided to 'skip' a specific merge.