[WIP - don't merge] Implement the typer

I fear we need to handle this differently ... `null` is a valid return for reference types, but not for primitive types, and is different from `void`