Reusable command sets

- Moved most of Commander functionality into CommandSet. Allows a
commandset to be repeatedly sent and received. Commander now simply
sends and provides the response buffer.
- Added internal exceptions for read/write errors.