Don't hide IOError when reading from the socket

This hides disconnection issues. The parent layer will then loop indefinitely
waiting for a message to arrive and burn the CPU.

It's best to catch IOError and implement a reconnection logic from the
outside.
Make sure to read all messages received
Replaces read_nonblock + IO.select with a simple sysread

There's no reason to use nonblock is the only thing it's going to do is to
block on IO.select for that same and single IO.