Add support for various device modules

* Create a structure of modules corresponding to a particular protocol type.
* Create implementation-specific controllers which take action when modules change.
* Create a template to handle type-safe generic controllers.
* Create a template to handle creating modules based on proto-generated files.
* TODO: Implement the actual controller logic.