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`
did some real testing on EC2 on this finally. You can do a push a few million runs through this mutex a second, which is far more traffic than yeller can handle right now anyway.