This patch moves the ConstraintSMT definition to the SMTConstraintManager header to make it easier to move the Z3 backend around.
We achieve this by not using shared_ptr anymore, as llvm::ImmutableSet doesn't seem to like it.
The solver specific exprs and sorts are cached in the Z3Solver object now and we move pointers to those objects around.
As a nice side-effect, SMTConstraintManager doesn't have to be a template anymore. Yay!
Why is this a path-sensitive data?
Wouldn't we always automatically map the same symbol to the same SMT expression? If we would, then this should be a global. If we wouldn't, then the path-sensitive trait is already useless, because the SMT expression would probably change between nodes on the same path as well.