[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
This test is valid as we don't return `RootOf` in `solve_univariate` if we can't solve the given polynomial.
Why we don't return `RootOf`? Because `RootOf` is specific to polynomials and I don't feel it is good to have polynomials as a special case.