[WIP] Rewriting the Univariate Solver

This PR aims to rewrite a cleaner and robust univariate equation solver.
    - [x] polynomial
    - [x] rational
    - [x] trigonometric
    - [ ] functions solvable by LambertW
> Can't we use solve?

We can but it will be unclean. For most of the cases this function deals with in `solve_univariate` the imaginary part turns out to be zero. `solve(0, x)` returns `[]` for both no solution and arbitrary solutions. We will have to add a special to check if the input expression to `solve` is zero. Then there can be cases with infinitely many solutions.