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.
We are different from bash, yes, but bash is a good standard for how `PATH` is to be interpreted. The only more authoritative source would be `execvp()`, although I chose bash largely because I ran across a reference to the code bash uses to implement `PATH`-splitting.

Glancing at the `execvp()` impl for some version of libc on OS X, it behaves much more like our current implementation, where every empty component is treated as `.`, and an empty `PATH` has a single empty component.

I suppose `execvp()` provides sufficient justification for leaving things as they are.