Dotty 0.19 (Scala 3) features: contextual abstractions
First, a minor thing here:

def (me: Me) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg], Entity[Me, InMsg]): Unit


The second given parameter is actually redundant - it's literally the same type as  this, and with contextual parameters, there shouldn't be any other instance.

In fact, implementation of send in Person shows that you can have a default impl:

def (me: Me) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg]): Unit =
  receiver.receive(me, msg)(given this)




Next, something more subtle:

def (me: Me) receive[Sender, ReplyMsg] (sender: Sender, msg: InMsg) (given Entity[Sender, ReplyMsg]): Unit


Whoever is implementing this will have to support any ReplyMsg, and therefore won't be able to create one (without breaking type system by casting or nulls). Try implementing it in a way that sends something back - you won't be able to make a call to send compile with normal code. If it's desirable, you can simplify the signature using existentials:

def (me: Me) receive[Sender] (sender: Sender, msg: InMsg) (given Entity[Sender, ?]): Unit


But I think it's not, as you wanted to reply to things. You'll have to work out a way to make it work - the simplest one being having 3 parameters - Entity[Me, In, Out] and accepting something that has Me[Other, Out, In].