Improve error handling in join ctx manager.
Change how Connection.stats is initialized.
Split join into concurrent and liner join.
Split Bucket.delete_keys into two methods.
Make key methods more explit.

Split Key.upload into multiple methods to allow explicit
differentiation between path based vs file based uploads.
Made redirects dicts instead of lists and improved how they
are handled internally. Fixed assumptions about redirects
(that they didn't need configuration: they do) by adding them
directly to the key method. Split up delete_keys into sub
requests. Changed key upload logging.