The approach with channels from (1) looks dubious to me. You have omitted the important part explaining it by clarity, but what is missing is important for understanding of the concept. Maybe it's just me.
You have to call server.Run() in a goroutine in (4), otherwise your code will block at this method.