split the project into several modules. fixes #19

I did a full split on each module and got lazy for now on the tests, they are all in the testing module.
If it is ok, can we make the root project not depend on `testing`. I am working around this in ivory at the moment with exludes. This change will make it heaps easier to manage.