Make requests time out

Requests are failed after (a hard coded) five seconds. They are never sent if the timeout happened while the request was queued.

If a request has been sent its channel cannot be reused since the response may come at a later time. This means that a connection can be starved of channels if too many requests get lost in such a way that the server never sends any replies.

If the response comes after the request has timed out the response will be ignored, but the channel cleared.
Make the timeout configurable

Also avoid scheduling a timer if no timeout is specified.
Add timeout support to RequestRunner
Modernize expectations in the RequestRunner specs
Add timeout support to AsyncClient and PreparedStatement

Change #execute in both to take an options hash with consistency and timeout (with backwards compatibility that checks if it is a symbol).
Make prepared statements raise ArgumentError when it detects wrong number of bound args

Non completely error-proof since there's an optional last argument, but better than before when it was incidental.