Prevent starvation in case of many concurrent requests and timeouts

In case there are many concurrent requests and the callbacks for the futures create more requests, there is starvation of existing requests. If there are timeouts involved, they may be triggered because of this starvation, but this is undesired behavior even without timeouts.
Also, in case there is a timeout, the id = nil line in flush_request_queue causes it to miss out on the event, which in extreme cases make cause the system to go into a state in which there are requests waiting, but they will never be sent.

`next` works by raising an exception. It's handled completely internally to the runtime, but it unwinds the stack and all that. At least in JRuby it's quite expensive compared to just avoiding running the rest of the loop body with an if.