Currently, Eshell only keeps track of the head and tail processes in a pipeline. That works for most things, but it can cause issues with Eshell thinking the pipeline is done too early. If the tail process ends first, we assume the entire pipeline is done, when that's not always true. These patches change things so that Eshell now keeps track of every process in a pipeline and waits for them to be done before proceeding on with the rest of Eshell's evaluation. That's less error-prone, and matches the behavior of other shells. (This also helps prepare the codebase for the addition of a new feature for Eshell: job control. I have a mostly-working version of that locally, so once this merges and I've finished the job control patches, I'll post them to a new bug.)