What's the TLDR on why this is a language feature vs a library?
The reason is: you want certain guarantees. For example, in Erlang you can set up a monitor on a process, and when that process exits for any reason, you get a notification, {EXIT, Reason}. Even if that reason was a catastrophic failure of some sort.
If this is implemented as a library, then the runtime can kill your code at any time, and you'll never know what happened.
Compare Erlang's error handling and monitors: https://erlang.org/doc/reference_manual/processes.html#error...
In a distributed system, I'm pretty certain you cannot guarantee receipt of an expected message, no matter what you try to do.