The first type is used to send messages that have to reach every node (from the corresponding shard, metachain, consensus group, etc.) and the second type is used to resolve requests coming from directly-connected peers.
The Messenger interface with its implementation is used to define the way to communicate between the nodes.