.NET observer design pattern implemented with IObservable<T> and IObserver<T>