Add WIP FTP stream support classes

RE: chfoo/wpull#23
http.stream: Update docstring
ftp: Add util.reply_code_tuple() Reply.code_tuple()
add WIP ftp.command.Commander
Abstract client and client session.
Abstract lines from http.Request to URLPropertyMixin
fixup! Abstract client and client session.
WIP Add FTP client
testing.ftp: Add get_url(). Fix unsafe-thread writer.close()
WIP FTP MLSD support.
fixup! WIP FTP MLSD support.
Add WIP LIST parser.

[ci skip]
sys.setdlopenflags doesn't exist on PyPy, so catch AttributeError
fuzz_fusil: Catch socket.error

re: https://bitbucket.org/haypo/fusil/issue/3/serverclientclose-raises-errno-107

[ci skip]
Add assert messages to some assert statements.
dns: Use repr() instead of coerce_str_to_ascii()
document: Remove to_str() used for Python 2.
ftp.ls: WIP Stateful date time heuristics for 12/24 period and DMY/MDY.
factory: Raise error if new() is called more than once per class
connection.py: Assert port is int.