Design Expr without virtual inheritance

In practice, the distinction between "safe" and "unsafe"
expressions is rather cumbersome. Furthermore, it introduces
virtual inheritance without contributing much to the common
use case of building expressions. So we simplify the design
of the library by avoiding the complications that virtual
inheritance brings with it.

More advanced use cases such as traversing the expression
tree (DAG) are still supported but the traversal might require
now additional runtime checks of SMT sorts. That's OK given the
overall simplifications to the design.