Support streaming file transfers

This commit modifies the `DiskFileSystem` interface to support
streaming file transfers, and implements streaming transfers as the
default. Interface changes are as follows:

* DiskFileSystem#write now takes an `IO` object instead of a `String`.
* DiskFileSystem#read expects to receive a block and yields an `IO`
  object to the block.