Multipart File Transfer

This PR is ready for CR.

Overview of changes:

* Added a `commands.File` interface that implements `io.Reader` (which also has a filename and can be read in parts)
* Changed from accessing file argument values in `Request#Arguments()` to a separate `Request#Files()`
* Open files recursively on the client (and make them into `commands.File`s)
* Transfer files as multipart in `commands/http`
> you use `req.Files()` (even if some of the files are technically directories).

But that's confusing! @maybebtc thoughts?

> They will error if you try to call `Read()`/`Close()`.

Not sold on this. Not sure, but maybe TRTTD is this:

```Go
type FilesystemObject struct {
  
  // FileReader returns a Reader for the contents of this object.
  // returns nil if object is not a file (i.e. is a directory)
  FileReader() io.ReadCloser
  
  // Name is the filesystem name of this object.
  Name() string

  // have one for each. checking !IsDirectory() isn't super clear
  IsDirectory() bool
  IsFile() bool
}
```

I wish there was a better name. I wish early fs designers had been prescient enough to realize directories and files shouldnt be different things. :(

> It gets the next file from the directory (has to be this kind of API so we can support serial file transports like multipart).

Right! Nice! overall, this interface works really nicely for the clients.