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.