Optimize the futures returned by Future.resolved and .failed

Avoid creating listeners and the lock, avoid locking and call callbacks immediately.
Make Future#map work without a block
Make Future#recover work without a block
Refactor Future.all and .first for style
Rewrite the future combinators using CompletableFuture instead of Promise

This creates one less object for each link in a chain of async operations.
Extract commonalities from the future combinators
Merge branch 'future_additions'
Make Request#write take the protocol version

Also refactor the FrameEncoder specs
Make QueryRequest compatible with the v2 protocol
Make protocol version configurable from AsyncClient
Make ExecuteRequest compatible with the v2 protocol
Remove a dead line of code from FrameDecoder
Add bound variable support to QueryRequest

Currently only supports string variables. This required adding an extra parameter to the constructor, and that required changes all over the place.
Add bound variable support to Client#execute
Update the Client#execute docs with bound variable info
Make protocol version a required argument for CqlProtocolHandler

And set it to v2 in the integration tests except for authentication (because that's not v2 compatible yet)
Add #paging_state to RowsResultResponse
Pass the protocol version to Request#decode! and descendants
Add #result_metadata to PreparedResult
Mark Frame{Encoder,Decoder} with @private

[ci skip]