C++ std::vector<T> and Rust std::vec::Vec<T> support

Add basic std::vector and std::vec::Vec support across FFI boundary.
diff --git a/tests/test.rs b/tests/test.rs
index 1cd85df..17fcfca 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -32,6 +32,45 @@
     assert_eq!(b"2020\0", ffi::c_return_sliceu8(&shared));
     assert_eq!("2020", ffi::c_return_rust_string());
     assert_eq!("2020", ffi::c_return_unique_ptr_string().to_str().unwrap());
+    assert_eq!(
+        4,
+        ffi::c_return_unique_ptr_vector_u8()
+            .as_ref()
+            .unwrap()
+            .size()
+    );
+    assert_eq!(
+        200_u8,
+        ffi::c_return_unique_ptr_vector_u8()
+            .as_ref()
+            .unwrap()
+            .into_iter()
+            .sum()
+    );
+    assert_eq!(
+        200.5_f64,
+        ffi::c_return_unique_ptr_vector_f64()
+            .as_ref()
+            .unwrap()
+            .into_iter()
+            .sum()
+    );
+    assert_eq!(
+        2,
+        ffi::c_return_unique_ptr_vector_shared()
+            .as_ref()
+            .unwrap()
+            .size()
+    );
+    assert_eq!(
+        2021_usize,
+        ffi::c_return_unique_ptr_vector_shared()
+            .as_ref()
+            .unwrap()
+            .into_iter()
+            .map(|o| o.z)
+            .sum()
+    );
 }
 
 #[test]
@@ -42,6 +81,18 @@
         "logic error",
         ffi::c_fail_return_primitive().unwrap_err().what(),
     );
+    assert_eq!(
+        "ok",
+        ffi::c_try_return_string()
+            .unwrap()
+            .as_ref()
+            .unwrap()
+            .to_string()
+    );
+    assert_eq!(
+        "logic error getting string",
+        ffi::c_fail_return_string().unwrap_err().what(),
+    );
     assert_eq!(2020, *ffi::c_try_return_box().unwrap());
     assert_eq!("2020", *ffi::c_try_return_ref(&"2020".to_owned()).unwrap());
     assert_eq!("2020", ffi::c_try_return_str("2020").unwrap());
@@ -65,6 +116,22 @@
     check!(ffi::c_take_unique_ptr_string(
         ffi::c_return_unique_ptr_string()
     ));
+    check!(ffi::c_take_unique_ptr_vector_u8(
+        ffi::c_return_unique_ptr_vector_u8()
+    ));
+    check!(ffi::c_take_unique_ptr_vector_f64(
+        ffi::c_return_unique_ptr_vector_f64()
+    ));
+    check!(ffi::c_take_unique_ptr_vector_shared(
+        ffi::c_return_unique_ptr_vector_shared()
+    ));
+
+    check!(ffi::c_take_vec_u8(&[86_u8, 75_u8, 30_u8, 9_u8].to_vec()));
+
+    check!(ffi::c_take_vec_shared(&vec![
+        ffi::Shared { z: 1010 },
+        ffi::Shared { z: 1011 }
+    ]));
 }
 
 #[test]