Move Rust symbols required by C++ to a separate Buck target

Closes #168.
diff --git a/src/rust_string.rs b/src/rust_string.rs
index 6f3e64b..a923ced 100644
--- a/src/rust_string.rs
+++ b/src/rust_string.rs
@@ -1,7 +1,4 @@
-use std::mem::{self, ManuallyDrop, MaybeUninit};
-use std::ptr;
-use std::slice;
-use std::str;
+use std::mem;
 
 #[repr(C)]
 pub struct RustString {
@@ -30,46 +27,5 @@
     }
 }
 
-#[export_name = "cxxbridge03$string$new"]
-unsafe extern "C" fn string_new(this: &mut MaybeUninit<String>) {
-    ptr::write(this.as_mut_ptr(), String::new());
-}
-
-#[export_name = "cxxbridge03$string$clone"]
-unsafe extern "C" fn string_clone(this: &mut MaybeUninit<String>, other: &String) {
-    ptr::write(this.as_mut_ptr(), other.clone());
-}
-
-#[export_name = "cxxbridge03$string$from"]
-unsafe extern "C" fn string_from(
-    this: &mut MaybeUninit<String>,
-    ptr: *const u8,
-    len: usize,
-) -> bool {
-    let slice = slice::from_raw_parts(ptr, len);
-    match str::from_utf8(slice) {
-        Ok(s) => {
-            ptr::write(this.as_mut_ptr(), s.to_owned());
-            true
-        }
-        Err(_) => false,
-    }
-}
-
-#[export_name = "cxxbridge03$string$drop"]
-unsafe extern "C" fn string_drop(this: &mut ManuallyDrop<String>) {
-    ManuallyDrop::drop(this);
-}
-
-#[export_name = "cxxbridge03$string$ptr"]
-unsafe extern "C" fn string_ptr(this: &String) -> *const u8 {
-    this.as_ptr()
-}
-
-#[export_name = "cxxbridge03$string$len"]
-unsafe extern "C" fn string_len(this: &String) -> usize {
-    this.len()
-}
-
 const_assert_eq!(mem::size_of::<[usize; 3]>(), mem::size_of::<String>());
 const_assert_eq!(mem::align_of::<usize>(), mem::align_of::<String>());