Command refactor

internals are coupled, makes maintainability and extensibility hard. This aims to improve this situation by loosening the coupling and laying the ground-work for some inversion of control patterns.