public API refactoring

- [x] consolidate the various inconsistent ways to configure certain `Reader` properties into an `nsq.Config` struct, with no public members, that exposes `Set(key string, value interface{})` (this method will leverage the pre-existing `Configure(...)` code to coerce values into the right types)
- [x] improve plumbing of and expose all usable `Message` commands (`FIN`, `REQ`, `TOUCH`)
- [x] eliminate "async" interface (and associated `FinishedMessage` code)
- [x] refactor the "sync" interface to require use of the `Message.{FIN,REQ,TOUCH}` methods rather than interpret the return value from the handler
- [x] remove `SendCommand` and buffering such that users of `Conn` flush explicitly (and the `Conn` has a `bufio.Writer`)
- [x] potentially rename `Reader/Writer` (which have pre-existing golang conventions) to `Subscriber/Publisher`
- [x] simplify `Writer` error handling (so you dont have to check `err` **and** `frameType`)
- [x] provide a simple logging level wrapper
- [x] support "requeue without backoff"
- [x] `s/msg.Write/msg.WriteTo` to satisfy `WriterTo` and remove `msg.EncodeBytes()` (you can use `WriteTo`)
- [x] remove use of `binary.{Read,Write}` (slow)
- [x] use `SetHandler` over `AddHandler` and add `HandlerFunc` convenience type
- [x] cleanup some other exported methods like `SetMaxInFlight`, `ConnectionMaxInFlight`, etc.

The last two will result in a public API that mirrors the same changes we made to `pynsq` which some confusion and ambiguity.