implement substitution of ftv frames into symbol stack
return substitutions from typeOf instead of keeping ftvs in monad state
infer types of most expression types
some cleanup