Why is that? On the low level everything is a state of electronic cells. Files address those cells in a suitable fashion. Modern programming abstractions such as async/await are very simple, but fail miserably if you need something really complex and efficient.
Files are not a good abstraction for events. Signals are broken in many ways. And DBus is both extremely clunky to use and non-portable.
There isn’t a built-in event paradigm similar to how streams and pipes are an integral part of the Unix-style CLI.