Keep replication history with exponentially increasing granularity

This work is a based heavily on an earlier version from Adam Kocoloski with a few major changes. First, there's a new code organization in mem3_rep along with a split of RPC calls into the new mem3_rpc module.

The second large change is how the actual checkpoint history is now stored. Instead of being one long list of entries, the entries are stored in lists keyed by the source node. This makes sure that we don't accidentally mix checkpoints after shards are moved around a cluster.

I was also quite confused by the implementation of adding checkpoints to the history. The newer version is quite a bit longer in terms of lines of code but I think the implementation is considerably easier to understand and reason about.

I've also added quite a few unit tests for both `mem3_rep:find_source_seq/4` and `mem3_rpc:add_checkpoint/2`.