Created new block ID allocator & put it into use.

Created ID allocator which intelligently allocates blocks of IDs
and refreshes them automatically at the halfway-through point.

Moved Store to use new ID allocators for Raft IDs and Range IDs.
Split up Store.CreateRange into methods for getting a BootstrapRangeMetadata
and creating a RangeMetadata using a replicas slice and range key intervals
which allocates IDs and populates the metadata as necessary. This will be
used from the range split code.
It definitely shouldn't happen. But if someone configured a minID to be 2 but set block size to 1, they'd run into this. Also, and again, it shouldn't really happen in practice, someone could start with a key which already has a negative value. I could do something more flexible and have the channel be for interface{} and return errors through it and an arbitrary type for the allocation trigger. This would allow negative IDs, etc. But I kind of like the more constrained ID allocator.