Implement Observable.takeUntil()

For my project I needed ``Observable.takeUntil()``. As I have no prior experience with the monifu.js codebase, I wonder how to implement new operations. In particular, I noticed that some methods are using locking, but not all of them. When is this required?

Also, I suspect that my use of ``tick()`` in the test case is not entirely correct. I would like to write a test case which pushes a sequence of elements, but at a certain element a second Observable pops in, pushing one element which then completes the Observable returned by ``takeUntil()``. This will ensure the correct behaviour when the processing was succesful. We'd also need a test case checking the error behaviour. As this is not done for the other operations either, is there a best practice?

By the way, IntelliJ stripped some trailing whitespaces. I hope that's not a problem.
Note that if we detect a `Cancel`, then we shouldn't stream any more events if we can help it, not even `onError`. It can still happen, since [by contract](https://github.com/monifu/monifu/wiki/Rx-Contract-and-Design-Guidelines#143-should-not-wait-on-the-futureack-result-of-onnext-for-signaling-oncomplete-or-onerror) the producer can send an `onError` without waiting for the result of the previous `onNext` to complete, but if we already saw `Cancel` then we should not send it. 

It would be good here to make an `if (!done)` check.