[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
> Bad for us.
 > >   Why we don't return RootOf?
> It's a bug.

This test is supposed to testing if `solve` is returning `RootOf` if it cannot solve the given polynomial. I don't consider it a bug if `solve_univariate` cannot solve it too.
```
In [2]: f = x**5 - 15*x**3 - 5*x**2 + 10*x + 20

In [3]: solve(f, x)
Out[3]: 
[RootOf(x**5 - 15*x**3 - 5*x**2 + 10*x + 20, 0),
 RootOf(x**5 - 15*x**3 - 5*x**2 + 10*x + 20, 1),
 RootOf(x**5 - 15*x**3 - 5*x**2 + 10*x + 20, 2),
 RootOf(x**5 - 15*x**3 - 5*x**2 + 10*x + 20, 3),
 RootOf(x**5 - 15*x**3 - 5*x**2 + 10*x + 20, 4)]
```