Adding super/extends so that Observable is covariant

Ok, so this pull request changes a *lot* of lines. It's mostly generalizing all the `FuncX`s to be used like `FuncX[-T1, -T2, ..., -TX, +R]` (contravariant parameters, covariant return type) and all the `Observer`s to be used "in a contravariant way". A few of the `Observable` uses are covariant, now, too (mostly `zip`).

This is the pull request for #326.

This doesn't look very good in the code (thanks Java). Also, it doesn't seem to make Scala interop easier at all (at least not yet).

Please take a look. I'm not exactly happy with the result. - Maybe I'm doing something wrong here? - I've still got hope that there's an easier way...

The pull request compiles and tests ok for me (except for the Clojure module, but that's another story and not due to my changes).