[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
For some reason I really prefer having empty spaces between large repeated-if blocks like this.  It makes it feel less scary.  Perhaps this style could be applied elsewhere like in the `solve_univariate` function.