We don't want users to be forced to compile the engine every time they want to run their game.
We can solve this with dynamic linking. We should probably have the user's code compiled as a shared object that the engine loads and runs at startup.
We should probably also abstract out some other engine components as well - the user will want to reference the logging library, World, Component, and Entity (possibly)
For the early games, we don't even need to care about this (I am not finding it immediately easy to figure out how to set up dynamic linking, and it's not mission critical); we can recompile the engine every time.