Builder: only use lazy I/O where necessary
Builder: only use lazy I/O where necessary

Each ByteString chunk must be built in one go and therefore we don't
need to be lazy in every write.  Lazy I/O is only needed to delay the
construction of the remaining ByteString chunks.

This also improves performance a bit:

Before
======

Binary (de)serialisation benchmarks:
100MB of Word8  in chunks of 16 (Host endian):   53.9 MB/s write
100MB of Word16 in chunks of 16 (Host endian):  104.8 MB/s write
100MB of Word32 in chunks of 16 (Host endian):  213.1 MB/s write
100MB of Word64 in chunks of 16 (Host endian):  131.5 MB/s write

After
=====

Binary (de)serialisation benchmarks:
100MB of Word8  in chunks of 16 (Host endian):   70.1 MB/s write
100MB of Word16 in chunks of 16 (Host endian):  144.2 MB/s write
100MB of Word32 in chunks of 16 (Host endian):  281.3 MB/s write
100MB of Word64 in chunks of 16 (Host endian):  146.8 MB/s write

ezyang/binary,bergmark/binary,beni55/binary,x456/binary,fpco/binary,beni55/binary,basvandijk/binary,flowbox-public/binary,flowbox-public/binary