Contains three levels of block priority to allow for
scan-resistance and in-memory families. A block is added with an inMemory
flag if necessary, otherwise a block becomes a single access priority. Once
a blocked is accessed again, it changes to multiple access. This is used
to prevent scans from thrashing the cache, adding a least-frequently-used
element to the eviction algorithm.

Each priority is given its own chunk of the total cache to ensure
fairness during eviction. Each priority will retain close to its maximum
size, however, if any priority is not using its entire chunk the others
are able to grow beyond their chunk size.

Instantiated at a minimum with the total size and average block size.
All sizes are in bytes. The block size is not especially important as this
cache is fully dynamic in its sizing of blocks. It is only used for
pre-allocating data structures and in initial heap estimation of the map.

The detailed constructor defines the sizes for the three priorities (they
should total to the maximum size defined). It also sets the levels that
trigger and control the eviction thread.

The acceptable size is the cache size level which triggers the eviction
process to start. It evicts enough blocks to get the size below the
minimum size specified.

Eviction happens in a separate thread and involves a single full-scan
of the map. It determines how many bytes must be freed to reach the minimum
size, and then while scanning determines the fewest least-recently-used
blocks necessary from each of the three priorities (would be 3 times bytes
to free). It then uses the priority chunk sizes to evict fairly according
to the relative sizes and usage.

cacheBlock

It is assumed this will NEVER be called on an already cached block. If
that is done, it is assumed that you are reinserting the same exact
block due to a race condition and will update the buffer but not modify
the size of the cache.

getBlockCacheColumnFamilySummaries

Performs a BlockCache summary and returns a List of BlockCacheColumnFamilySummary objects.
This method could be fairly heavyweight in that it evaluates the entire HBase file-system
against what is in the RegionServer BlockCache.

The contract of this interface is to return the List in sorted order by Table name, then
ColumnFamily.