the TL;DR is calling an operator creates a new object which wraps the old one, calling subscribe passes a listener to that object (which tends to wrap it and then call subscribe on the wrapped object), and data flowing down is a callback on the listener which then trickles its way through the layers of wrapping