updated to use standard guava Futures and ListenableFuture