I appreciate the details! And alethic's explanation in the comments was easy to understand. The key part I missed was that it's a messaging system between software processes. And your insight that it's used in functional programming helps too!
Ah yes, separate software processes is probably the confusion here. Avoiding certain classes of deadlocks and hangs is also something that's not particularly guaranteed by imperative programs. You can throw a type system on it and get some of them (session types I think are quite expressive), but in practice I don't know of any imperative languages with a type system rich enough to do this.