Start the process for a handle from `external_create()` and return a
promise fulfilled with `({ stdout, stderr, exit_code })` when the
process exits (a non-zero exit still fulfills -- read `r[2]`), or
rejected with a socket error (`EESECURITY`, `EESOCKET`, ...) if
spawn fails -- or with `"*external process aborted"` if the owner
is destructed first. The child is started with `posix_spawn()`
(vfork fast path on glibc; Win32 uses `CreateProcess`).
int h = external_create(CURL_CMD, ({ "-s", url }));
mixed *r = await external_run(h);
string body = external_stdout(h); /* same as r[0] */
int code = external_exit_code(h); /* same as r[2] */
Drive stdin with `external_write()` (before or after start) and
`external_close_stdin()` when the child should see EOF:
int h = external_create(CAT_CMD, ({}));
external_write(h, payload);
external_close_stdin(h);
mixed *r = await external_run(h);
A handle can be run only once. Use `external_start(index, args)`
when there is no handle.