exchange can deal with move-only types
constant_observable<T> converts to constant_observable<U> when T converts to U