Factor out semantics and change interpreter to language

This is a better organization, semantically.
Merge branch 'grammar'