RiakFuture redesign

This changes our RiakFuture in the core to be much like a Netty future.

The big win is rather than just throwing exceptions, it indicates that the operation failed and the new `FailureInfo` class encapsulates the exception thrown, as well as identifying information about the query. This makes the `RiakFutureListener` far more complete/useful as you don't just get an exception - the `FailureInfo` contains identifying information about the operation (usually a `Location`).

Note that this does not address the user level API current usage of `RiakFuture`. Where we expect an exception to be thrown by `RiakFuture.get()` ... it will no longer do so, and instead return `null`. The next PR will be addressing the user level API.