Defining a sync. key-value filesystem abstraction.

Porting over the localStorage file system to use this abstraction.

There were several deficiencies in our previous implementation that should
now be resolved:
* Hard-to-reason about caching behavior.
* Terrible renaming performance due to how we used keys in the store.

This solution mimicks behavior seen in other JS file systems, most notably
Filer.js, that, in turn, mimick behavior seen in EXT2. We store nodes
(data and info nodes) at random GUIDs, and start each path search at the
root. I will later add GUID caching to amortize the path lookup cost.

TODO:
* Port the in-memory file system to this abstraction.
* Remove IndexedFileSystem and any now-outdated support code.
* Finish the asynchronous implementation of the same abstraction.