Pull apart SSHClient.connect and Transport.run()

This is mostly of interest for those who want to subclass SSHClient and Transport objects to change behavior. Currently, a user who wants to modify how paramiko does things (like auth, hence the name of this branch) needs to copy-paste huge swathes of code inside paramiko within the subclass, which is really brittle. This is intended to break up Transport.run() and SSHClient.connect() into usable chunks, which seems like a good first step in that regard.
This I like very much though.