The API looks natural. :+1: to hiding the libuv plumbing. 

Where was the suggestion for async? I don't see how it could be async without breaking legacy plugins. If scripts need async `system()` they should use `jobstart()`.

Looking at the old `get_cmd_output` and `make_filter_cmd`, it was literally building a command string to send to the shell, and `input` was send via a `<` shell redirect. `:help shelltemp` says Vim uses pipes if `shelltemp=0`, but that doesn't appear to affect `system()`.