Adds storage driver interface, tests, and three basic implementations

Re-opening of #630 with the new orphan next-generation branch.

@dmp42 @wking @bacongobbler @noxiouz 
As mentioned in #630, `Move` will typically involve full copies followed by deletion, save for the local filesystem. I can see the benefit for the local filesystem but would it make sense to remove this to reduce boilerplate between storage drivers?