CombineLatest without synchronization

Finally, I managed to get rid of all the synchronization in `CombineLatest` (it all boils down to two atomics and one concurrent map). As concurrency is always hairy to get right: Can someone please check that it's okay like that?

I also added static methods to `Observable` for it, and fixed the handling of exceptions within the combining function.

Usage is (though non-asynchronous source observables don't make sense, I use these here in order to keep the example simple):
```java
Observable<Integer> o1 = Observable.from(1, 2, 3);
Observable<Integer> o2 = Observable.from(4, 5, 6);
Observable<Integer> r = Observable.combineLatest(o1, o2, new Func2<Integer, Integer, Integer>() {
  @Override Integer call(Integer a, Integer b) {
    return a + b;
  }
});
```