I don't understand the problem your described.
I think the logic goes as:
1. a goroutine managing outgoing connections.
2. a goroutine managing incoming connections.
The details of concurrency can be left behind at this moment. But connection state is definitely needed.
This should not be complicated and I envision it is similar to our previous P2P project.
@yifan-gu