expression AST now has embedded types (but they are ignored)
infer returns expression with type attached
update 'propagate' inference to produce annotated ast