WIP: Pluggable Hardware Managers

The goal of this is to be able to install an arbitrary python module capable of providing the `BaseHardwareManager` interface, and have the agent find it, test its suitability, and use it if it is the most suitable. This way, someone operating Teeth can add hardware-specific logic without needing to modify the agent (although we might want to start accepting some such plugins upstream).

I'm not at all sold on the actual way it works, today my goal is just:

1. Have a `BaseHardwareManager` that provides sane functionality for most hardware
2. Be able to override it just by installing a suitable python module

TODO: tests