Allow operations to cross range boundaries

 * add proto.Combinable interface

Combinable is implemented by responses whose requests may access multiple ranges,
such as {Scan,DeleteRange}Response and allows multiple responses to be merged
into a single one transparently.

* allow multi-range Scan and DeleteRange

adapted the distributed sender to split such requests up
and adress them to the individual ranges.
The Combinable interface is used to create a single response
from those parts which is returned with the client.Call.

I just mean I'm not fully comfortable swapping the pointer at call.Reply, as opposed to changing the value of the response object that call.Reply points to. Like I said, I don't think there's any usage of this which would cause an issue, but consider a caller which did the following:

  reply := &proto.DeleteRangeResponse{}
  call := &client.Call{
    Method: proto.DeleteRange,
    Args: &proto.DeleteRangeRequest{...},
    Reply: reply,
  }
  kvClient.Call(call)
  if reply.GoError() == nil {
    // This will always be true, even if error was set...!
    ...
  }