refactor connection establishment

reduces duplicated code, and makes it easier for future changes
to connection establishment because it's all in one place now
Needs documentation.

What are your thoughts on accepting the full `args` here instead of just the `auth` hash? While we're only using the `auth` portion, it seems overly specific for the scope of the method (*connection* management) and could evolve to need all of the connection options.