use a channel and fixed number of workers to distribute work

the current listener is super slow, likely due to scheduling overhead as it spawns a goroutine per packet. Let's see if a channel that sends work off to a fixed number of worker goroutines improves things.