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.
Not sure i like this. It would be nice to be able to do this without resorting to doing several ifs and returns or relying on throwing exceptions, since they are still quite expensive in python and transport is kind of hot code part. I would prefer if we could somehow expose the handler_table  for the different messages in this method and do more of that logic here. Not 100% sure how that would be solved in a good way though.

I was previously looking into the old run method to try and simplify it but I could never really figure out *how* i wanted to solve it. I'm open to larger refactorings of the code to get it nicer though.