Make ens_test ensure app dependencies are started
Support M:N synctree to LevelDB instance mappings

By default, each peer synctree maps to a unique on-disk LevelDB
database. This commit enables ensemble backends to override this
behavior, supporting M:N mappings where multiple trees are stored
in the same on-disk instance.

This change is predominately aimed at Riak, which will use this
feature to map all peers associated with a single vnode to a common
per-vnode synctree LevelDB instance. Riak AAE already does a similar
thing in its hashtree code. Using fewer instances results in better
usage of file handles, write buffers, and the block/file cache.
Delete all remaining backend syncing code
Cleanup the synctree object hashing code path

This commit cleans up the object hashing code path used by peers to
compute and verify hashes used for integrity checking. This commit
also sets the stage to extend the hashing mechanism in the future to
directly include object hashes as part of the synctree metadata.
Support (optional) synchronous update_hash

The current behavior of asynchronously updating remote synctrees after
a put works well in practice. However, for maximum byzantine tolerance
synctree updates should be synchronous -- occurring on the put path
itself and requiring a valid quorum response before considering a put
successful.

This commit adds synchronous synctree updates and makes the choice
user configurable. The default remains asynchronous.
Modify synctree hashing to enable future extension

This commit adds a single byte to the data encoding for bucket hashes to
enable easy future extension of the data format to support different
hash functions.
Minor code changes/cleanup

-- Improve various comments / fix typos
-- Add missing types and specs for synctree.erl
-- Consistently use orddict_find in synctree.erl
-- Add missing erlang:trunc calls in synctree.erl
Make synctree trust-after-restart configurable

This commit makes it so users can override the default behavior of
never trusting synctrees after a peer restart. Doing so provides less
guarantees against byzantine faults, however such allows ensembles to
operate with simple majorities in all circumstances rather than
needing byzantine-tolerant trusted majorities.

This provides a knob similar to the previous low vs medium trust
setting which is no longer available under the new integrity checking
approach.

This commit also updates the peer ping_quorum command to include the
leader's tree_ready state. This is used in Riak as part of an updated
ensemble_status command.