Separate driver interfaces and make abstract

Separate the 4 driver interfaces into abstract interface classes,
and also add an abstract driver class.  Make the existing driver
implementations inherit from these as appropriate.

This should help clearly express which methods a given driver
needs to implement.

Change-Id: I918d35eced7b0581a65d53d2ebcd7124f3b3f0a6
5 files changed