Add caching layer

Add a tiered caching layer to the database adapter.

This uses a ConcurrentHashMap based local level 1 cache, for
performance.  Hazelcast is used to provide a distributed level 2
cache, this also provides cache coherence.  Put and remove
operations on the level 2 cache are listened for by all nodes and
corresponding entries in the level 1 cache are updated or removed.