std::os - Add join_paths, make setenv non-utf8 capable

This commit changes `os` in two ways:

* It adds a `join_paths` function that is the converse to `split_paths`,
  easing manipulation of the `PATH` environment variable according to
  platform conventions.

* It changes `setenv` to take a `BytesContainer` rather than a `&str`
  value, since environment variables may have non-utf8 values on some
  platforms. Since `&str` is a `BytesContainer`, this is *not* a
  breaking change.

Along the way, it also refactors the `split_paths` function so that
`cfg` switches are applied internally (and the function header is given
only once). This fixes a bug: the doc comment had an example for only
one platform.
Unfortunately it turns out that it's a bit more complicated than expected.

After investigating how bash behaves, it's a bit more ad-hoc and less elegant than this. Notably:

* An empty `PATH` yields zero paths, whereas this code yields a single `"."` path
* `PATH=":"` yields a single `"."` path
* Multiple colons in a row behaves rather unexpectedly:
  * When the `PATH` contains nothing but colons, the number of empty paths yielded is `floor(ncolon/2)+1`. That is, 1 colon is 1 path, 2-3 colons are 2 paths, 4-5 colons are 3 paths, etc.
  * When the `PATH` contains multiple colons in a row with at least one non-empty path, it's a little more sensible. The number of empty paths is just `ceil(ncolon/2)`.

Is it worth trying to match bash? I think it's worth doing at least *something* here, because upon reflection it seems wrong for `split_paths("")` to return a path (and similarly, `split_paths(":")` should probably then return a single empty path, although that's more open to debate).