rustc: remove some dead functions
std: add str.to_c_str()
std: rename str.as_bytes_with_null_consume() to str.to_bytes()
std: rewrite run::with_{argv,envp,dirp} to copy C strings
std: remove os::as_c_charp
std: move str::as_buf into StrSlice
std: move str::as_c_str into StrSlice
std: remove str::NullTerminatedStr
std: cleanup os and str tests
std: add test for str::as_c_str
std and extra: use as_c_str instead of as_buf in a couple places
std: rename str.as_buf to as_imm_buf, add str.as_mut_buf
std: remove str::to_owned and str::raw::slice_bytes_owned
std: remove a malloc from os::fill_charp_buf
std: remove str::from_bytes_with_null
extra: optimize away some mallocs in uv_ll
rustc: add logging to calling rustc::middle::trans::base::decl_fn
extra: make sure time::match_digits does not read past the end of the str
std: replace str::as_c_str with std::c_str
std and rustc: explicitly pass c strings to c functions

When strings lose their trailing null, this pattern will become dangerous:

let foo = "bar";
let foo_ptr: *u8 = &foo[0];

Instead we should use c_strs to handle this correctly.