When a DistributedFuture times out, cancel the task and remove it from
the queue. Otherwise it will remain in the pending tasks queue and get
executed disjoined from any client side logic.

This is safe to do because onRemoval is fired after the
DistributedFuture is already removed from the futures cache and will not
raise a cancelation exception.
Merge pull request #28 from sirusdv/upstream

When a DistributedFuture times out, cancel the task and remove it from the queue