Fixed typo in comment
Simplified and more flexible error handling

FtpServerError takes a mandatory code argument which, combined with the
message, produces the familiar "#{code} #{message}" string for output
to the client.

Existing error classes PermanentFileSystemError and
TransientFileSystemError default code to 550 and 450 respectively, but
can be passed other codes (e.g. 552).

All error classes check the validity of the code and raise an
ArgumentError if the code is invalid.
Merge pull request #27 from ragalie/552-errors

Support 552 "exceeded allocation" errors
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.
Backwards-compatibility with 1.9 and 2.0
Stream binary files in a memory efficient way

Binary files don't respond to IO#gets in a memory-friendly way. This
commit extracts the logic for interacting with the FTP stream to a
dedicated Stream class that reads and writes in chunks (regardless of
file structure) and handles the conversion logic for the 'A' data type.

Interface changes are as follows:

* DiskFileSystem#write now takes an `Ftpd::Stream` object instead of
  an `IO`.