Several changes to ZooStorage and ExternalStorage, mostly to improve robustness:
* Reworked lease renewal in ZooStorage to handle non-linearizable ZooKeeper
  behavior (version mismatches aren't always a problem)
* Log messages for all errors, even those that are recoverable.
* Eliminated ZooStorage::renewLeaseRetryCycles: instead, retry immediately
  without releasing the monitor lock.
* Replaced "testName" mechanism for testing with "testStatus1" and "testStatus2".
Changed test for leadership: it's now OK to operate without leadership, as long as you never had it (this used to be illegal). But, once you've gotten leadership you can't ever operate without it again.
Modified CoordinatorUpdateManager so that externalLastFinished doesn't
change in external storage until recoveries complete (otherwise, a
second crash during recovery could cause information about incomplete
operations to be lost).
Added more log messages during recovery to make it clearer what is being reconstructed.
Reworked CoordinatorServerList to store a list of pending updates
in each entry and include this in the information written to external
storage. This is needed to handle situations where there are multiple
pending updates for single server at the time the coordinator crashes.
Modified BackupSelector to handle REMOVE event with no ADD event without crashing.
Improved readability of messages in ClientMain.cc (--exercise option).
Modified ServerList to log all updates to the server list.
Added --clusterName and --reset options to CoordinateorMain.
Modified MasterService and BackupService to return STATUS_RETRY if
an RPC is received before the service is fully initialized.
Removed definitions for obsolete RPC BACKUP_ASSIGN_GROUP.
Modified the cluster framework back to create the 'logs' and the 'shm' directories
using relative path. The 'logs' directory will be created based on the current working
directory and the 'shm' directory will be a sub-directory of 'logs'
Previously, Enumeration returned Key-Value objects stored in the table. This
code focusses on implementing key only enumeration, where the value (or the data
field) is not returned. This is achieved by including a keysOnly flag and helps
us in saving a lot of overhead while returning objects on the server side. Also,
a high level function nextKeyAndData() is implemented which attempts to remove
Object abstraction from the client side for enumeration.