Adds a new method to a `WebSocket`: `try_read_message`.
Calling `read_message` would always enter a loop until receipt of a
message, invalidating any modifications to the underlying stream's
timeout or blocking mode. The new method allows these to be respected.
This is structured so that the semantics/behaviour of `read_message`
remain unchanged, exposing the inner part of its loop publicly.