Adds storage driver interface, tests, and three basic implementations

Re-opening of #630 with the new orphan next-generation branch.

@dmp42 @wking @bacongobbler @noxiouz 
One thing we could do is change the method signature to `List(prefix string, count int, interface{} marker) (keys []string, nextMarker interface{}, err error)` and return an untyped (`interface{}`) continuation marker with the keys. The caller would be expected to only provide a marker they were given from the last call to `List`, and this would work for both numeric offsets and key markers. `nil` would have to be accepted by each storage driver as a valid initial marker.