Change ErrorResponse#to_s to show code as hex

This makes it easier to compare the error with the list in the protocol specification when debugging.
Propagate error details when available
Add examples to the Client#execute docs

[ci skip]
Move frame encoding from Request to a separate class

This cleans things up, and gives us a place to handle multiple protocol versions cleanly.
Move all response type specs to their own files
Replace ResponseFrame with FrameDecoder
Move {Status,Topology}ChangeEventResponse to correctly named files
Move the selection of response class to Response.decode!

This means the list of supported opcodes is populated dynamically.
Make a tiny optimization change in FrameDecoder
Refactor frame decompression in FrameDecoder
Merge branch 'frame_encoding_decoding_refactor'