[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
```
In [1]: a, p, q = Wild('a'), Wild('p'), Wild('q')

In [2]: pattern_match = sqrt(2).match(a*p**q)

In [3]: pattern_match
Out[3]: {a: 1, p: 2, q: 1/2}
```

Why the hell you want such "denominators"?