code decoupling

The idea behind these changes is to:
1) de-couple the code to to make it easy to add unit test-support.  unit tests do not need any dependencies so the dependencies must be isolated. 1) de-couple the code to improve robustness
2) de-couple the code to developers to work on different areas of the code without causing merge conflicts
3) de-couple the code to reduce compile times - only changes files need compiling.
4) better named driver files so that developers don't have to look up chip names.
5) easier for new developers to find the code - this should encourage developers to contribute.
6) introduce good software best practices - this should encourage developers to contribute - good developers may stay away if they don't see best practices in use.