Blocking buffer until experiment

This is a solution to the time gap problem for #844.

I've added an subscribeOn overload where the user can explicitly request a buffering behavior. In addition, SubscribeOn checks the type of the Observable and enters buffering mode for GroupedObservable and PublishSubject. I think these code options should be mutually exclusive:
  1. either we only check for Observable type, but then new kinds of observables or hidden observables won't work,
  2. or ask the programmer in the documentation/tutorial to explicitly request buffering in certain operator compositions.

I personally favor option 2).

A drawback is that this blocking subscribeOn deadlocks on pools with a single thread. We can, of course, check for Trampoline, Test and Immediate schedulers, but not schedulers created via ```Schedulers.executor```, or the computation scheduler on a single-core machine.