Here, we define the protocol of the node. It includes messages which the node can handle and messages it can send. Create data classes only for the body part of a maelstrom message. The top level fields (i.e. src, dest) are handled by the library
Maelstrom documentation has information about core fields such as msg_id, type and in_reply_to.
We don't need to define these fields in our message classes as they are handled by the framework automatically.
A node is defined by extending the MaelstromNode trait and providing a program value. The program value is a ZIO effect that defines the behavior of the node. The receive function is used to define a handler for incoming request messages.