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.
I would personally view us as pretty distinct from bash, and along those lines pretty separate from it. These are pretty obscure edge cases, so I'd almost just rather err on the side of simplicity rather than completeness at this point in time (this is a good patch to have regardless).

We can always end up tweaking the behavior later on with minimal impact on clients.