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

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.