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]
Make a small optimization in ExecuteRequest

Don't send zeroes, basically
Add support for requesting that the server does not send metadata to ExecuteRequest
Add basic unit test coverage of QueryResult

It's had coverage through being used all over the place, but it was time for some focused documentation-like specs.
Don't create a new TypeConverter for every rows result
Pass the frame length with the call to Request.decode!
Ask the server not to send metadata in the response to prepared statements

In v2 prepared statements get metadata about their results along with the metadata about the parameters. When a prepared statement has this data it can ask the server not to send it on every response, hopefully saving a lot of bandwidth.

This patch introduces LazyQueryResult and RawRowsResultResponse that make it possible to defer row decoding to the absolute last moment. It also adds PreparedStatement#result_metadata for access to the result metadata.

All decoder methods also get the frame length, even though it's only RowsResultResponse that uses it.