Don't pass around type objects so much

The metamodel is slow. We shouldn't use it lightly.

Signed-off-by: Casey Dahlin <casey.dahlin@gmail.com>
Declare and use an end-of-stream token

Empty set might be better for errors.

Signed-off-by: Casey Dahlin <casey.dahlin@gmail.com>