Refactoring of TermContext

**please review**

This is still far from where I want to get, but I think the general direction is right.

Changes in this pull request:
 - extract the static (independent of `TermContext`) part of `ConstrainedTerm` into `ConstrainedTerm.Data`
 - extract the static part of `SymbolicConstraint` into `SymbolicConstraint.Data`
 - split off `GlobalContext` from `TermContext`
 - make BuiltinFunction into an actual object (not a collection of static methods) and attach it to GlobalContext
 - make `*Transformer` always take a `TermContext`. It cannot take just a `Definition`. Yes, taking just a definition is cleaner, but it was creating a `TermContext` afterwards anyhow. So it was just hiding the junk. Now, it's in the open.

@andreistefanescu, @dwightguth, @traiansf, have a look.