Bucket deletion now blindly removes all files in the bucket

We weren't doing any per entry locking around the deletes, so there
wasn't any benefit of deleting entries prior to bucket removal.
Use SHA1(Entry) to distribute entries in sub dirs

Previously, we wrote all entries to $BUCKET/encode($ENTRY).
The bucket subdirectory could become large enough to run into file
system limits on the number of files in a directory or file system
performance issues with finding entries in a large directory.

The new format takes the following form:

    $BUCKET/$AA/$BB/$CC/$DD/encode($ENTRY)

where $AA, ..., $DD correspond to the first four bytes of
SHA(encode($ENTRY)) in hex.

Each subdirectory will contain at most 256 items. This keeps the
directory size well below file system limits. We chose two character
subdirs so that filesystems with linear directory search algorithms
would be able to find entries quickly. The cost of the subdirectories
is use of inodes. So for a given set of files we incur a 4x cost in
inode use.

We chose four levels as an unscientific compromise of inode cost and
size of fileset that will avoid large directories. With four levels,
we expect to be able to handle ~2^32 files consuming ~2^34 inodes.

By keeping the basename of the file the encoded entry, we can support
bucket listing via recursive file globbing and end up with an on disk
format that is a bit easier for a human to understand/debug.

Also worth noting is that we do not remove empty subdirectories when
entries are deleted. At this time we plan to leave this as known
behavior: inode usage will increase over time. Inode use can be
reclaimed by removing empty directories and this could be done
manually with the bookshelf service stopped. If this becomes a pain
point, we could establish optional behavior on restart to do the
cleaning. Removing the directories on-demand introduces a need for
locking which we'd prefer to avoid if possible.

Misc Dialyzer fix ups

* Remove unused fun head for entry_delete

* Add opscoderl_wm to analysis
Don't export entry_md/1 as it isn't used
Remove unused entry_path/1
Store bucket and entry in entryref for reading

This means we don't need parse_path and makes the read-side line up
with how write-side operates.
Use Path from entryref rec rather than recompute in entry_md
Upgrade to new disk format on sup start

On startup, bookshelf looks for a disk format version file. If not
found, it assumes "version 0", upgrades, and writes the version file.
Fixes for bucket names that require encoding
Cache entryref and entry_md in request context

Previously we were making system calls to fstat a given file multiple
times to service a single GET request. With this patch, we memoize the
file descriptor and fstat info (entry_md) to avoid the extra calls.
bookshelf 0.2.9
Merge branch 'sf/multi-level'