Add lots more machinery to help identify errors outside of a `push` command

I'm not 100% done with #24 and #25 but I think this is enough to safely merge right now while work continues

This PR also adds the `Producer#connect(timeout)` method which will use `rd_kafka_metadata` to attempt to establish a connection to the brokers outside of a `Producer#push` invocation