Distribute control.c functionality across various modules
The control.c module accesses, and is accessed by, many other modules: it represents a failure of modularity and layering.
Instead, we should give control.c only the responsibility of marshalling and unmarshalling messages for the controller, and give individual modules the responsibility for publishing events and handling commands.