Add io.scif.memory package

Added a MemoryService with default implementation. This class can be
used to help manage available memory, limiting allocation until more
memory is available. It can also monitor empty references, using the
new RefHandler plugins.

Initial PhantomReference-based RefHandlers have been provided, for
cleaning up SCIFIOCells and SCIFIOCellCaches (the two classes that
currently override finalize).
Refactor cache functionality to remove finalize

The memory-based SCIFIOCellCache and disk-based MapDBCache have been
updated to use the new MemoryService to manage stale SCIFIOCells,
instead of relying on overriden finalize mehthods.

Overriding finalize can cause objects to be resurrected, and is
generally highly discouraged. Instead, we can now register SCIFIOCells
and SCIFIOCellCaches via phantom references in the MemoryService and
maintain only weak references to these objects internally. When they
become eligible for garbage collection, the MemoryService takes care of
performing clean up operations (which happen on a separate thread to
limit performance impact).

Also, by using the MemoryService's memory management API, all loops that
would run until memory had freed up, catching OOM errors, have been
removed - as these were also quite dangerous.

Unfortunately, we do rely on System.gc() calls when at memory limits.
But this seems reasonable, as - if we are at our maximum memory
allotment, what else can we do but wait for objects to be garbage
collected?

This patch also updates MapDB to 0.97,and updates the CacheServiceTests
to reflect the new reference-based functionality.

By moving the cleanup functionality to separate threads and delaying it
until actually necessary, we incur significantly less overhead. Thus
this closes #69.
wip: cache improvements
memory service: avoid repeated refs to the same referent
report cache failure
fix: cache creation