Allow multiple pipes to be read from in the PipeChannelManager

This allows multiple pipes to be ready from in the PipeChannelManager's Listener and fixes the case where a single pipe can hold everyone up if it's slow to process -- potentially causing use to take several seconds to shutdown a fork.

This change basically changes each pipe to be read from a separate thread when it's ready.  This unblocks the main loop and allow pipes to be read in parallel.

/to @StabbyCutyou @akasper @ydderd