project structure

this is premature extraction/optimisation at its finest, but it's easier
to maintain/expand/build upon in the long run