Add integration tests, bunch of refactoring/small changes

Start doing some integration tests by spinning up an http server in the tests.

A bunch of refactoring/changes fell out of this:

- extracted error handling into a new file
- made cycling hostnames threadsafe
- make it possible to pass `nil` as additional info to many of the functions in `yeller.go`
we want to spread load over yeller's servers - having each client only connect to one server at startup and then always sending stuff to that server means there's *potential* for it to get overloaded (ofc that assumes that the client can drive traffic faster than haproxy, which seems unlikely, but I'd still rather keep this in line with the other clients). It means load is at least evenly spread out to yeller's servers.