Aggressively use RVO and move semantics for expressions

Foremost, this patch overloads the SMT unary and binary operators
to support move semantics. This surfaced a design bug in the Term<T>
constructors where both Term<T>(const SharedExpr&) as well as
Term<T>(const SharedExpr&) caused overload resolution ambiguity,
regardless whether the constructors are private or not. To fix this,
a private Term(Expr* const) constructor with friends were added.
This means now that Term<T> and SharedExpr integrate seamlessly.

Furthermore, these changes created the backbone for a significant
performance boost with the help of return value optimizations (RVO)
that bypass copy and move constructors altogether.