Raise Error on Metadata Failures

First step in handling producer failures. This simplifies the message sending loop by extracting metadata refreshing out of it. The `Producer#messages_send` call now only attempts to send messages if we can fetch topic information for all topics in the message set.

Additionally, this PR includes a lot of changes to make integration tests more reliable. In particular it spins up and down the cluster around each integration test which makes them take longer but is more reliable. We can work in the future to make this quicker.
Yeah, this is kind of a stop-gap measure for now. I have in mind a pretty big rewrite for the producer once there is time.