Issue #6268: More bugfixes about BOM, UTF-16 and UTF-32

 * Fix seek() method of codecs.open(), don't write the BOM twice after seek(0)
 * Fix reset() method of codecs, UTF-16, UTF-32 and StreamWriter classes
 * test_codecs: use "w+" mode instead of "wt+". "t" mode is not supported by
   Solaris or Windows, but does it really exist? I found it the in the issue.
diff --git a/Lib/encodings/utf_16.py b/Lib/encodings/utf_16.py
index eff08f3..61bb041 100644
--- a/Lib/encodings/utf_16.py
+++ b/Lib/encodings/utf_16.py
@@ -58,17 +58,23 @@
 
 class StreamWriter(codecs.StreamWriter):
     def __init__(self, stream, errors='strict'):
-        self.bom_written = False
         codecs.StreamWriter.__init__(self, stream, errors)
+        self.encoder = None
+
+    def reset(self):
+        codecs.StreamWriter.reset(self)
+        self.encoder = None
 
     def encode(self, input, errors='strict'):
-        self.bom_written = True
-        result = codecs.utf_16_encode(input, errors)
-        if sys.byteorder == 'little':
-            self.encode = codecs.utf_16_le_encode
+        if self.encoder is None:
+            result = codecs.utf_16encoder(input, errors)
+            if sys.byteorder == 'little':
+                self.encoder = codecs.utf_16_leencoder
+            else:
+                self.encoder = codecs.utf_16_beencoder
+            return result
         else:
-            self.encode = codecs.utf_16_be_encode
-        return result
+            return self.encoder(input, errors)
 
 class StreamReader(codecs.StreamReader):