Refactor the way compilation units work

This is a relatively large rework of how interactive compilation units work, and how reconciliation and other semantic actions happen. The main goal was to clean up the Play plugin implementation and make it easy for other scala-based DSLs to be implemented in the same manner as Play templates.

The bulk of the work is in the last commit, see comments there.
`soureMap` could be renamed to `updateSourceMap` and `lastSourceMap` could be renamed to `sourceMap`.