Connections should be lightweight: it should be no problem to
create thousands of connections between endpoints.
Error handling is explicit: every function declares as part of
its type which errors it can return (no exceptions are thrown)
Error handling is "abstract": errors that originate from
implementation specific problems (such as "no more sockets" in
the TCP implementation) get mapped to generic errors
("insufficient resources") at the Transport level.
This package provides the generic interface only; you will
probably also want to install at least one transport
implementation (network-transport-*).