[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
> Should FiniteSet(a).intersect(S.Reals) remain evaluated (currently it returns {a})? 

UNevaluated?  Yes, it should (unless a.is_real is True).

> Should 1 in FiniteSet(a) return True ?

No, probably it should raise an exception.

> A cleaner approach will be somehow returning the condition in which the solution is valid.

Then we break `solveset(foo).is_Set` invariant.