Fix seek offset deltas

We always store the offset of the next available message, so we shouldn't decrement the offset deltas
when seeking by an extra 1
Raise a ConnectionError when a socket.error is raised when receiving data
Also, log.exception() is unhelpfully noisy. Use log.error() with some error details in the message instead.
Fix client error handling

This differentiates between errors that occur when sending the request
and receiving the response, and adds BufferUnderflowError handling.
Add a limit to fetch buffer size, and actually retry requests when fetch size is too small

Note: This can cause fetching a message to exceed a given timeout, but timeouts are not guaranteed anyways, and in this case it's the client's fault for not sending a big enough buffer size rather than the kafka server. This can be bad if max_fetch_size is None (no limit) and there is some message in Kafka that is crazy huge, but that is why we should have some max_fetch_size.
Handle starting/stopping Kafka brokers that are already started/stopped in integration tests

If some of the tests stop brokers then error out, the teardown method will try to close the
same brokers and fail. This change allows it to continue.
Remove unnecessary brackets
Fix client and consumer params in integration tests
Add tests for limited and unlimited consumer max_buffer_size