Implement v0.6 string fields

This is predominantly a wrapper around `BytesMut`, for simplicity.
Bytes and string fields are mostly the same, except for possible UTF-8 handling.

This also implements some minor parts of `ProtoStr` that were missed.

PiperOrigin-RevId: 561422951
diff --git a/rust/optional.rs b/rust/optional.rs
index bdbc5ec..2e576e1 100644
--- a/rust/optional.rs
+++ b/rust/optional.rs
@@ -234,7 +234,7 @@
 where
     T: ProxiedWithPresence + ?Sized + 'msg,
 {
-    inner: T::PresentMutData<'msg>,
+    pub(crate) inner: T::PresentMutData<'msg>,
 }
 
 impl<'msg, T: ProxiedWithPresence + ?Sized + 'msg> Debug for PresentField<'msg, T> {
@@ -312,7 +312,7 @@
 where
     T: ProxiedWithPresence + ?Sized + 'a,
 {
-    inner: T::AbsentMutData<'a>,
+    pub(crate) inner: T::AbsentMutData<'a>,
 }
 
 impl<'msg, T: ProxiedWithPresence + ?Sized + 'msg> Debug for AbsentField<'msg, T> {