Fixed clusterperf.py so that all tests can be run at least semantically. Note that some tests ignore master_args argument.
Minor documentation typo in LogEntryTypes.h.
Slight change in Buffer.cc to reduce the number of log messages
generated for large storage allocations in buffers.
Modified InfRcTransport to generate log messages when outgoing
RPCs are delayed a long time because there aren't enough
receive buffers for them (i.e. too many other RPCs are already
in progress).
Modified ReplicatedSegment to throttle the number of outstanding
freeSegment requests at any given time (in some conditions, the
cleaner could generate so many free segments that it overwhelmed
the RPC system, causing congestion and even ping timeouts).
Added MultiOp bindings and corresponding unit tests.

 - Added MultiRead, MultiWrite, and MultiRemove Java bindings
 - Added unit tests for MultiOp Java bindings
 - Fixed random missing status in the Java bindings' Status enum
 - Moved Java Status enum into its own file
 - Updated Javadocs
Moved Javadoc to RAMCloud wiki, modified Java bindings to use shared ByteBuffer

 - Moved Javadoc to https://ramcloud.stanford.edu/docs/javadoc/
 - Most Java bindings now used a shared memory location with C++
   - Read down to ~0.25 us difference from C++
   - Write down to ~0.2 us difference from C++
   - Multiops down to ~0.25 us difference per object from C++
 - Chaged RejectRules C++ struct to be packed
 - Added unit tests for MultiOpHandler classes
 - Updated Status.h instructions for update Java bindings
Whoops, forgot to add version reading to Java multiread

 - Added reading versions to Java multiread bindings
 - Changed unit tests to reflect that
Modified clusterperf "basic" test to replace average with median and
to print several other percentiles (min, 99th, etc.).
Cleaned up ClusterPerf.cc to eliminate usage of MakeKey, removed KeyUtil.h.
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.