refactor(library/tactic): remove dead code, make proof_state a smart pointer, cleanup

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
refactor(library/tactic): simplify proof_builder API

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
feat(library/tactic): add precision and counterexample builder to proof state

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
refactor(library/tactic): improve solve method

Now, it produces the following outcomes:
1- A proof
2- A counterexample
3- A list of (unsolved) final states

Remark: the solve method does not check whether the proof or counterexample is correct.

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>