Improved some indexing related functions in TableManager and Object classes.

1. Improved abstraction for createIndex(), dropIndex() between CoordinatorService
and TableManager classes. Now all of the work (including creating /
dropping backing tables for indexlets) is done by TableManager class and
no information leaks to CoordinatorService.
This has also resulted in monitor-style functions for createTable(),
dropIndex() and dropTable() in TableManager.

2. TableManager::createIndex() now returns true if the index already existed.
This is required for idempotency that is important in case of coordinator crash
and recovery.

3. Changed Object::appendValueToBuffer and Object::appendKeysAndValueToBuffer to
use Buffer* instead of Buffer&.

4. Improved some more documentation and RAMCloud log messages and simplified
some code.
More improvements to SLIK code.

1. Improved abstraction between MasterService and IndexletManager for
addIndexlet() function. This reduces the number of checks, and reduces
information leakage. Also simplified corresponding unit tests.

2. In IndexletManager, adding indexlet now “succeeds” if the indexlet
already existed. Adding an indexlet with boundaries that overlap those for
another indexlet now throws an internal error as this should never happen
except in case of coding errors.

3. Improved documentation, made some small changes to simplify code.
Examples of small changes include:
Removed redundant checks; createIndex() no longer returns a boolean value as
it was not being used; moved function declarations in IndexletManager such
that they would be easier to use.
Defining and using TableAndIndexId struct which improves readability.
Removing two wrapper functions from IndexletManager & other changes.

IndexletManager had wrapper functions for addIndexlet() and
deleteIndexlet() that parsed Indexlets protobuf.
Moving the parsing to calling functions in MasterService.

Also changing the names of two variables in Indexlets protobuf
to be consistent with naming at other places in the code.

Improving some documentation.
Return OK in IndexletManager::removeEntry() if entry didn't exist.
Simplifying interface for TabletManager:deleteTablet

TabletManager::deleteTablet now returns successfully if the tablet
was successfully deleted or if no such tablet existed.
It throws an InternalError if the tablet overlaps in range with
one or more existing tablets (as this should never happen and
indicates a coding error).
Simplifying interface for IndexletManager::deleteIndexlet

IndexletManager::deleteIndexlet now returns successfully if the
indexlet was successfully deleted or if no such indexlet existed.
It throws an InternalError if the indexlet overlaps in range with
one or more existing indexlets (as this should never happen and
indicates a coding error).
Changed abstraction of lookupIndexKeys and simplifying unit tests.

Changed abstraction of IndexletManager::lookupIndexKeys to accept
request and response headers and rpc as input parameters rather
than individual parameters.
This is done because IndexletManager class had to be indirectly
aware of WireFormat to append the key hashes and next key in the
correct format in the response buffer. This makes the dependency
more explicit (and hence hopefully less bug prone) and simplifies
interface and reduces redundant processing.

This change requires access to MockCluster and RamCloud class
in IndexletManager unit tests. Use this for lookupIndexKeys related
tests. Also simplified the unit tests. It needs some more improvement
to be done in another commit soon.
Adding new Status STATUS_INVALID_PARAMETER and corresp ClientException.
Disallow client from creating index with indexId 0.

Throw InvalidParameterException as indexId 0 is reserved for the
primary key and a secondary key index should not be created
for it.
Created new class PerfStats (efficient way of gathering statistics,
because it keeps a separate record for each thread, and aggregates
when results are needed).  Also added new GET_PERF_STATS ServerControl.
Modified ObjectManager to record counts of reads and writes in PerfStats.
Modified HashTable to generate log messages when overflow buckets
are created.
Mofidied ServiceManager so that if there are queued requests when
a worker completes, it first gets a new request to the worker and
*then* sends the reply message (this has a significant impact on
throughput for multireads, where it can take a long time to send
the reply). Also, keep track of the duty cycle for each thread in
PerfStats, and eliminate old RawMetric workerIdleSpinTicks metric.
Created new clusterperf benchmarks: readThroughput,  multiReadThroughput.
Various cleanups to clusterperf. Adjusted Various parameters so that
most benchmarks now run with TCP over 1GigE. Refactored the handling
of master-args in clusterperf.py (it didn't conform to the way other
options were handled). Changed default benchmarks that are run (only
the most useful ones are run now).
Minor typo in clusterperf.py.
Changed default number of master service threads from 5 to 3 (5 is
too many for optimum performance in our cluster).
Alphabetizing Key class.
Cleanup and improving some comments in IndexletManager.