Building an app truly modular is hard. Lending ideas from actors and event sourcing is one approach I've found successful.
I've used it for several applications over the last couple of years, started with Java & Rx.
With Kotlin coroutines, channels, and flows we can now even omit Rx or other external libraries to make it happen.