Split ByteBuffer into writer/reader objects.

This allows the reader to reference data, thus avoiding unnecessary
allocations and memory copies.

BUG=webrtc:5155,webrtc:5670

Review URL: https://codereview.webrtc.org/1821083002

Cr-Commit-Position: refs/heads/master@{#12160}
diff --git a/webrtc/p2p/base/port.cc b/webrtc/p2p/base/port.cc
index 74b9edd..d26a930 100644
--- a/webrtc/p2p/base/port.cc
+++ b/webrtc/p2p/base/port.cc
@@ -343,7 +343,7 @@
   // Parse the request message.  If the packet is not a complete and correct
   // STUN message, then ignore it.
   rtc::scoped_ptr<IceMessage> stun_msg(new IceMessage());
-  rtc::ByteBuffer buf(data, size);
+  rtc::ByteBufferReader buf(data, size);
   if (!stun_msg->Read(&buf) || (buf.Length() > 0)) {
     return false;
   }
@@ -565,7 +565,7 @@
   response.AddFingerprint();
 
   // Send the response message.
-  rtc::ByteBuffer buf;
+  rtc::ByteBufferWriter buf;
   response.Write(&buf);
   rtc::PacketOptions options(DefaultDscpValue());
   auto err = SendTo(buf.Data(), buf.Length(), addr, options, false);
@@ -613,7 +613,7 @@
   response.AddFingerprint();
 
   // Send the response message.
-  rtc::ByteBuffer buf;
+  rtc::ByteBufferWriter buf;
   response.Write(&buf);
   rtc::PacketOptions options(DefaultDscpValue());
   SendTo(buf.Data(), buf.Length(), addr, options, false);