Allow unsafe SMT expressions to be created

This library should be usable by new or existing code that cannot
easily deal with templates. For this reason, each type-safe SMT
expression, Expr<T>, has a corresponding base class without the
template parameter T. To achieve this, we use virtual inheritance.
Rename IsBuiltin to IsPrimitive
Shorten names of built-in expression classes and functions
Overload built-in operators for UnsafeExpr class

These operators are useful for code that cannot use templates but
follows a strict coding discipline to ensure that SMT expressions
are well-sorted.