Reimplement the timeout operator and fix timeout bugs

This PR reimplemented the `timeout` operator. I also fixed the following bugs of `timeout`:
* The `timeout` can not work on a synchronized Observable. Unit test:
https://github.com/zsxwing/RxJava/commit/356a6902a6e96e4d1a131d71521b62d26596fd6c#diff-f181dce6b07869d0daacb404a292ce0cR231

* The selector variant of Timeout should throw `TimeoutException` when a timeout event happens without an other Observable. Unit test: https://github.com/zsxwing/RxJava/commit/356a6902a6e96e4d1a131d71521b62d26596fd6c#diff-836fc7028db94329e793dcc6075a258dR259
and
https://github.com/zsxwing/RxJava/commit/356a6902a6e96e4d1a131d71521b62d26596fd6c#diff-836fc7028db94329e793dcc6075a258dR289

* The selector variant of Timeout has a race condition between `onNext` and `timeout` methods. Unit test: https://github.com/zsxwing/RxJava/commit/356a6902a6e96e4d1a131d71521b62d26596fd6c#diff-836fc7028db94329e793dcc6075a258dR321
* The method signatures of some selector variants of Timeout are wrong.