Implemented Event/Command infrastructure

 - Removed controller and replaced all methods with commands
 - Created a system where command(s) are bound to event(s) at runtime

Still need to implement tests for this new infrastructure but it is a
massive improvement which should be much more flexible going forward
(and easily allow for future features like config/settings)