[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
> you should use the Intersection instance

Do mean `FiniteSet(a).intersect(S.Reals)`? The behavior of set with symbolic values is a little grey. Should `FiniteSet(a).intersect(S.Reals)` remain evaluated (currently it returns {a})? Should `1 in FiniteSet(a)` return `True` ? We need more discussion on such issues.

A cleaner approach will be somehow returning the condition in which the solution is valid. Maybe we should return a piecewise like Matlab does. See Example 6 http://www.mathworks.in/help/symbolic/mupad_ref/solve.html