Parallelizing writes to the index tables.

We basically add a thread pool to which we submit write tasks for each index table
in the batch. Each batch operates independently and either returns success or throws
an exception. If any write throws an exception, we will need to replay that entire batch
(at least in the current implementation), so we attempt to stop all pending index writes
as soon as possible.

Also added a CachingHTableFactory. Its a very simple caching algorithm - it just uses
the JVM GC to release HTables when they are not used. This lets us save the effort of
setting up and tearing down the table for each batch of index writes, potentially a huge gain
over time.
Merge pull request #439 from jyates/parallelize-index-writes

Parallelizing writes to the index tables.
Sort on client instead of server for grouped aggregation to fix issue #417