add io.ByteReader.
add testing/iotest package.
make bufio return error on short write.

R=r
DELTA=423  (208 added, 154 deleted, 61 changed)
OCL=28997
CL=28999
diff --git a/src/lib/bufio/bufio.go b/src/lib/bufio/bufio.go
index 3b4aeb8..7bfbb08 100644
--- a/src/lib/bufio/bufio.go
+++ b/src/lib/bufio/bufio.go
@@ -421,21 +421,17 @@
 	if b.err != nil {
 		return b.err
 	}
-	n := 0;
-	for n < b.n {
-		m, e := b.wr.Write(b.buf[n:b.n]);
-		n += m;
-		if m == 0 && e == nil {
-			e = io.ErrShortWrite
+	n, e := b.wr.Write(b.buf[0:b.n]);
+	if n < b.n && e == nil {
+		e = io.ErrShortWrite;
+	}
+	if e != nil {
+		if n > 0 && n < b.n {
+			copySlice(b.buf[0:b.n-n], b.buf[n:b.n])
 		}
-		if e != nil {
-			if n < b.n {
-				copySlice(b.buf[0:b.n-n], b.buf[n:b.n])
-			}
-			b.n -= n;
-			b.err = e;
-			return e
-		}
+		b.n -= n;
+		b.err = e;
+		return e
 	}
 	b.n = 0;
 	return nil
@@ -505,14 +501,14 @@
 
 // buffered input and output
 
-// ReadWriter stores (a pointer to) a Reader and a Writer.
+// ReadWriter stores pointers to a Reader and a Writer.
 // It implements io.ReadWriter.
 type ReadWriter struct {
 	*Reader;
 	*Writer;
 }
 
-// NewReadWriter allocates a new ReadWriter holding r and w.
+// NewReadWriter allocates a new ReadWriter that dispatches to r and w.
 func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
 	return &ReadWriter{r, w}
 }