Permit strings, tokens, and byte sequences to be moved out of Items

So that they can be used without copies.

PiperOrigin-RevId: 482804429
diff --git a/quiche/common/structured_headers.h b/quiche/common/structured_headers.h
index 9d94e90..8e0520b 100644
--- a/quiche/common/structured_headers.h
+++ b/quiche/common/structured_headers.h
@@ -9,6 +9,7 @@
 #include <map>
 #include <string>
 #include <tuple>
+#include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
@@ -119,6 +120,20 @@
     return *value;
   }
 
+  // Transfers ownership of the underlying String, Token, or Byte Sequence.
+  std::string TakeString() && {
+    struct Visitor {
+      std::string* operator()(absl::monostate&) { return nullptr; }
+      std::string* operator()(int64_t&) { return nullptr; }
+      std::string* operator()(double&) { return nullptr; }
+      std::string* operator()(std::string& value) { return &value; }
+      std::string* operator()(bool&) { return nullptr; }
+    };
+    std::string* value = absl::visit(Visitor(), value_);
+    QUICHE_CHECK(value);
+    return std::move(*value);
+  }
+
   ItemType Type() const { return static_cast<ItemType>(value_.index()); }
 
  private: