support for conversions between values and trees

This is very handy when interpretation of high-level trees calls into
interpretation of corresponding low-level trees with some of the trees
already evaluated during one of the previous steps.
adds Definitions.scala that contains references to useful symbols
instantiate now takes a Type, not a ClassSymbol

Java does have reified generics in the form of arrays, so just knowing
a symbol of something we're going to instantiate isn't going to cut it.

(It's enough to have a symbol when we want to express just List, but
we need a type to express something parameterized with other types).
interprets type tests and type casts

Another thing I missed when sketching the prototype. Type arguments of
applications can't be discarded in general case, because they do matter
in case of isInstanceOf and asInstanceOf intrinsics
interprets matches