I'm open to that. Not updating yet as I think we require more discussion due to the footnote bit. 

Rx borrowed from Scala in the definition of what to throw: https://github.com/Netflix/RxJava/issues/748#issuecomment-32471495 implemented here https://github.com/Netflix/RxJava/blob/master/rxjava-core/src/main/java/rx/exceptions/Exceptions.java#L56

If something breaks the contract it has to throw. For example, if `onError` throws there is no other choice. 

I think it's correct to state that the contract is that nothing should throw (with the given exceptions) but implementations also need to be practical and handle user error and assume things can be thrown in out-of-contract scenarios.