gsubprocess: Fix up communicate

We weren't closing the streams after we were
done reading or writing, which is kind of
essential.  The easy way to fix this is
to just use g_output_stream_splice() to a
GMemoryOutputStream rather than hand-rolling
it.  This results in a substantial reduction
of code complexity.

A second serious issue is that we were
marking the task as complete when the process
exits, but that's racy - there could still be
data to read from stdout.  Fix this by
just refcounting outstanding operations.

This code, not surprisingly, looks a lot
like the "multi" test.

Next, because processes output binary data,
I'd be forced to annotate the char*/length
pairs as (array) (element-type uint8).  But
rather than doing that, it's *far* simpler
to just use GBytes.

We need a version of this that actually validates
as UTF-8, that will be in the next patch.
gsubprocess: Add UTF-8 variants of communicate()

Over many years of writing code interacting with subprocesses,
a pattern that comes up a lot is to run a child and get its
output as UTF-8, to put inside a JSON document or render
in a GtkTextBuffer, etc.

It's very important to validate at the boundaries, and not
say deep inside Pango.

We could do this a bit more efficiently if done in a streaming
fashion, but realistically this should be OK for now.