Reduce complexity

This is a pretty significant refactor. Only usability changes are that *all* methods now return a readable stream at all times, and accept an optional callback. No more ```true``` parameter to get a stream.

Code-wise, this breaks all socket connection logic into ```lib/connection-manager.js``` which reduced overall complexity of everything quite a bit. It also allowed me to rewrite each method to be easier to follow and understand. This should be a pretty big improvement in maintainability.