[WIP] Rewriting the Univariate Solver

This PR aims to rewrite a cleaner and robust univariate equation solver.
- [ ] Univariate
    - [x] polynomial
    - [x] rational
    - [ ] trigonometric
    - [ ] functions with exp and log
- [ ] Multivariate
With standard assumptions techniques.  Either

    x = symbols('x', real=True) 
    result = solveset(x**3 - 1, x)

or

    with assuming Q.real(x):
        result = solveset(x**3 - 1, x)

I prefer `with assuming` to `assume=` because it lets us (for now) avoid the decision of which assumption system to support in `solveset/solve2`.  If new assumptions takes over then it will likely continue to support the `is_real` interface.