Test Cleanups - Improving ability to re-use functionality

Clean up the tests a little so that we can enhance re-usability
- functions that were helpers but did not do assertions were moved to base-classes
- some new test levels were added (ControllerTest, HookTest, and DriverTest) to provide some separation were relevant
  - HookTest and DriverTest use an abstract method for creating the "thing that will be tested" in order to keep the tests a little more generic. For the Metadata drivers, this works well as it makes the Mongo and Cassandra just the create driver function.
- Refactored the Swift Driver Test to use Python's mock for the Exception/Error handling tests instead of modifying the Mock object to toss exceptions. This also allows us to consolidate it down to a single test specific for the Swift driver
I'm reviewing all the tests and removing their unused imports as part of this PR.