Implement Rational

As of 83dd22e, the best time for benchmarks are:
```
$ ./expand1
Expanding: (y + x + z + w)^60
186ms
number of terms: 39711

$ ./expand2
Expanding: ((y + x + z + w)^15 + w)*(y + x + z + w)^15
1555ms
number of terms: 6272

$ ./expand3
Expanding: (z^x + x^y + y^x)^100
17ms
number of terms: 5151
```
While the master (8f17f41562689b14d40eb813372bddbc95602844) is:
```
$ ./expand1
Expanding: (y + x + z + w)^60
182ms
number of terms: 39711

$ ./expand2
Expanding: ((y + x + z + w)^15 + w)*(y + x + z + w)^15
1518ms
number of terms: 6272

$ ./expand3
Expanding: (z^x + x^y + y^x)^100
17ms
number of terms: 5151
```
So the slowdown so far is 2.4%.


As of 54710108bd865f7c7789adc42d44be41016c6041:
```
$ ./expand2 
Expanding: ((y + x + z + w)^15 + w)*(y + x + z + w)^15
1543ms
number of terms: 6272
```

As of 509dd3fd7754d0c2dc70a82b5e6c1b812347784d:
```
$ ./expand2
Expanding: ((y + x + z + w)^15 + w)*(y + x + z + w)^15
1540ms
number of terms: 6272
```
As of cf548c8b7186ce0f7a6efe44694658eb8ad952cc:
```
$ ./expand2
Expanding: ((y + x + z + w)^15 + w)*(y + x + z + w)^15
1539ms
number of terms: 6272
```
So overall slowdown is less than 1.4%, which I think is ok, given that we can now use the Rational class.

TODO:

* [x] See if using virtual functions wouldn't be faster
* [x] Implement Rational and test it