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/mailbox.py b/Lib/mailbox.py
index a37bec9..13e3eb7 100755
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -333,7 +333,7 @@
 
     def get_file(self, key):
         """Return a file-like representation or raise a KeyError."""
-        f = open(os.path.join(self._path, self._lookup(key)), 'rb')
+        f = open(os.path.join(self._path, self._lookup(key)), 'r')
         return _ProxyFile(f)
 
     def iterkeys(self):
@@ -936,7 +936,7 @@
     def get_file(self, key):
         """Return a file-like representation or raise a KeyError."""
         try:
-            f = open(os.path.join(self._path, str(key)), 'rb')
+            f = open(os.path.join(self._path, str(key)), 'r')
         except IOError as e:
             if e.errno == errno.ENOENT:
                 raise KeyError('No message with key: %s' % key)
@@ -1762,11 +1762,11 @@
 
     def read(self, size=None):
         """Read bytes."""
-        return str(self._read(size, self._file.read))
+        return self._read(size, self._file.read)
 
     def readline(self, size=None):
         """Read a line."""
-        return str(self._read(size, self._file.readline))
+        return self._read(size, self._file.readline)
 
     def readlines(self, sizehint=None):
         """Read multiple lines."""