[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
I prefer `solveset` over `solve`, especially if the two are likely to live side-by-side for a while.

@skirpichev would assume take a set of new assumptions like `assume=Q.real(x)`?  Perhaps we just drop adding extra assumption information alltogether and let users deal with complex results?  I guess this is consistent to `solve`'s current behavior.

```Python
In [6]: solve(x**3 - 1, x)
Out[6]: 
⎡           ___            ___  ⎤
⎢     1   ╲╱ 3 ⋅ⅈ    1   ╲╱ 3 ⋅ⅈ⎥
⎢1, - ─ - ───────, - ─ + ───────⎥
⎣     2      2       2      2   ⎦

In [8]: solveset(x**3 -1, x)
Warning: some of symbols in the expression are not 
specified to be real, this may lead to unexpected results
Out[8]: {1}
```