Refactor CellStub

The history of CellStub: In the old days we had the very same piece of code
repeated throughout dCache. Whenever we wanted to send a message for an RPC
style interaction, we would build CellMessage, send and wait for a reply, check
the reply for null (a timeout), for having the proper type, and rethrow any
error if the reply indicated an error.  CellStub was born to encapsulate this
repeating pattern.

CellStub also served as a way to encapsulate communication behaviour for a
particular destination. Rather than having a cell address, a timeout, and
possibly other parameters for every other service a component may need to talk
to, CellStub encapsulates all this and can be injected as a single reference.

CellStub isolated the dCache code from the low level details of the cell
communication. The idea was to simplify unit testing and to ease a migration to
JMS.

Later CellStub gained support for asynchronous callback based messaging,
exposing a higher level callback interface with processing aware of the
semantics of the Message class.

Lately the class has gained support for rate limiting the traffic it generates.

I feel CellStub has grown a little too much with to many responsibilities.  At
the same time it has several limitations and at a few places in dCache we have
code to work around these limitations.

This patch decouples the part of CellStub that deals with encapsulating
destination parameters and cell communication from the higher level semantics
of the Message class. In this first patch only the asynchronous message
processing is touched.

Rather than MessageCallback, CellStub now returns a Guava ListenableFuture.
The future provides the reply as is, thus there is no translation of failures
encoded in Message to exceptions. Cell exceptions, timeouts, or exception
replies are considered failures and the future will rethrow these as
exceptions.

Modelling the structure of Futures#addCallback, CellStub#addCallback adds
support for the old MessageCallback interface. Like before, it will interpret
errors encoded in the Message class and report those as failures.
MessageCallback is now limited to Message payload. Other payload has to use
Futures#addCallback instead.

Although CellStub still has all the same features as before, part of the Message
processing has been separated from the message passing code. ListenableFuture
also has the benefit that the callback can happen on another executor. The patch
doesn't update dCache code to make use of these features. That is left to
future patches.

Target: trunk
Require-notes: no
Require-book: no
Acked-by: Tigran Mkrtchyan <tigran.mkrtchyan@desy.de>
Patch: http://rb.dcache.org/r/6730/