start putting together an engine. this is more complicated than I usually do, but it might make unit tests possible