Merging the py3k-pep3137 branch back into the py3k branch.
No detailed change log; just check out the change log for the py3k-pep3137
branch.  The most obvious changes:

  - str8 renamed to bytes (PyString at the C level);
  - bytes renamed to buffer (PyBytes at the C level);
  - PyString and PyUnicode are no longer compatible.

I.e. we now have an immutable bytes type and a mutable bytes type.

The behavior of PyString was modified quite a bit, to make it more
bytes-like.  Some changes are still on the to-do list.
diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py
index 87e5745..d72eae9 100644
--- a/Lib/encodings/__init__.py
+++ b/Lib/encodings/__init__.py
@@ -52,7 +52,7 @@
         non-ASCII characters, these must be Latin-1 compatible.
 
     """
-    if isinstance(encoding, str8):
+    if isinstance(encoding, bytes):
         encoding = str(encoding, "ascii")
     chars = []
     punct = False
diff --git a/Lib/encodings/idna.py b/Lib/encodings/idna.py
index b81e5fa..30f507a 100644
--- a/Lib/encodings/idna.py
+++ b/Lib/encodings/idna.py
@@ -151,9 +151,9 @@
             raise UnicodeError("unsupported error handling "+errors)
 
         if not input:
-            return b"", 0
+            return b'', 0
 
-        result = b""
+        result = buffer()
         labels = dots.split(input)
         if labels and not labels[-1]:
             trailing_dot = b'.'
@@ -165,7 +165,7 @@
                 # Join with U+002E
                 result.extend(b'.')
             result.extend(ToASCII(label))
-        return result+trailing_dot, len(input)
+        return bytes(result+trailing_dot), len(input)
 
     def decode(self, input, errors='strict'):
 
@@ -216,7 +216,7 @@
                 if labels:
                     trailing_dot = b'.'
 
-        result = b""
+        result = buffer()
         size = 0
         for label in labels:
             if size:
@@ -228,7 +228,7 @@
 
         result += trailing_dot
         size += len(trailing_dot)
-        return (result, size)
+        return (bytes(result), size)
 
 class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
     def _buffer_decode(self, input, errors, final):
diff --git a/Lib/encodings/punycode.py b/Lib/encodings/punycode.py
index f08c807..56e6958 100644
--- a/Lib/encodings/punycode.py
+++ b/Lib/encodings/punycode.py
@@ -10,7 +10,7 @@
 
 def segregate(str):
     """3.1 Basic code point segregation"""
-    base = b""
+    base = buffer()
     extended = set()
     for c in str:
         if ord(c) < 128:
@@ -18,7 +18,7 @@
         else:
             extended.add(c)
     extended = sorted(extended)
-    return (base, extended)
+    return bytes(base), extended
 
 def selective_len(str, max):
     """Return the length of str, considering only characters below max."""
@@ -78,13 +78,13 @@
 digits = b"abcdefghijklmnopqrstuvwxyz0123456789"
 def generate_generalized_integer(N, bias):
     """3.3 Generalized variable-length integers"""
-    result = b""
+    result = buffer()
     j = 0
     while 1:
         t = T(j, bias)
         if N < t:
             result.append(digits[N])
-            return result
+            return bytes(result)
         result.append(digits[t + ((N - t) % (36 - t))])
         N = (N - t) // (36 - t)
         j += 1
@@ -107,13 +107,13 @@
 def generate_integers(baselen, deltas):
     """3.4 Bias adaptation"""
     # Punycode parameters: initial bias = 72, damp = 700, skew = 38
-    result = b""
+    result = buffer()
     bias = 72
     for points, delta in enumerate(deltas):
         s = generate_generalized_integer(delta, bias)
         result.extend(s)
         bias = adapt(delta, points==0, baselen+points+1)
-    return result
+    return bytes(result)
 
 def punycode_encode(text):
     base, extended = segregate(text)