Add storage abstraction level

With this PR is possible to use any storage as git repository (tar archive, for example).

Also, code reformatted using `go fmt`.