Engine: integer job status, improved stream API

* Jobs return an integer status instead of a string
* Status convention mimics unix process execution: 0=success, 1=generic error, 127="no such command"
* Stdout and Stderr support multiple thread-safe data receivers and ring buffer filtering
Engine: better testing of streams and of basic engine primitives. Coverage=81.2%
Fix a bug in Output.Write, and improve testing coverage of error cases.
Merge pull request #2781 from shykes/engine-status-int

Engine: integer status, better streaming, lots of tests