Support get-model for arrays in z3-smt
Unify and simplify function templates and unrolling banks

- Both Expr-based solvers and z3-based solvers rely on same template
  generation routines and unrolling strategy. Templates and unrolling
  bank is refactored in solvers.templates._

- Encoding is done through TemplateEncoder. Performance highly relies on
  an efficient TemplateEncoder.substitute() implementation.
Implement and test everything for smt-z3

 - Partial support for CVC4 (excluding constant arrays)