Refactoring out Implementer; decoupling domain module; moving tests to the appropriate modules