Flesh out the storage interface.

Summary:
All interaction with the storage interface occurs in a separate goroutine
to ensure that things can be properly sequenced without blocking the main
raft goroutine (and without complex async logic).  The raft goroutine
collects a list of dirty groups and sends a copy of their state to the
storage goroutine when it is ready.

Test Plan: go test

Reviewers: spencerkimball

Reviewed By: spencerkimball

Differential Revision: http://phabricator.andybons.com/D30
Replace string group names with a (type-aliased) int64.

Test Plan: go test

Reviewers: spencerkimball

Reviewed By: spencerkimball

Differential Revision: http://phabricator.andybons.com/D31
Merge remote-tracking branch 'origin/master'

* origin/master:
  Adds client side code for metadata lookup.
  Augmented in memory engine to use a binary tree (LLRB) and implement both scans and capacity measurement and enforcement.