Prevously, we would throw raw args arrays across the interface and the engine would do some additional parsing. Clean this up so we don't do that and all the parsing stays in `lumi`
Move most of the guts of `lumi` into the newly created `engine` package.