Refactor tagged union for cleaner interface
Add engine proxy and redesign message interface