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