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.
This error string is bad. It's got a format token in it, but this isn't a format string.

The error value could be converted to `String`, but I think it's just simpler to fix this to be a generic message (this way you don't have to worry about path segments that contain potentially garbage data making the error hard to read).

```rust
return Err("path segment contains `\"`");
```