New logic for synchronization.

1. Add subdirectory for log and snapshot.
2. Leader will not send COMMIT to the server who hasn't acked the
proposal.
3. Add firstDivergingPoint method to Log interface.
4. Change the logic of synchronization:

if peerZxid == this.lastZxid:
  send empty diff
else if peerZxid > this.lastZxid:
  if they are in same epoch:
    send truncate
  else:
    state transfer
else:
  if snapshot.zxid > peerZxid:
    state transfer
  else:
    does truncate + delta or diff depends on whether they have diverging point
    or not.
Merge pull request #197 from EasonLiao/sep_data_dir

New logic for synchronization.
Associate context with callbacks.

1. Add context object to method send, flush, remove, takeSnapshot.
2. Pass context object back to corresponding callbacks.
3. Add removed callback (corresponds to remove call).
4. Pass all the pending requests context back to user in recovering
callback to notify them the (possible)failed pending requests.