add named rules to the README

Summary:
Also improve wording in a few places and clarify the relationship
between `PERU_DIR` and `PERU_CACHE`

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D100
let hg fetches print to stdout

Summary: This lets it take advantage of the new fancy display.

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D94
clean up the curl download logic

Summary:
Create `curl_plugin_shared.download_file` to get rid of some duplication
between curl fetch and reup. Add progress printing to this function, so
that curl now plays nicely with the fancy terminal.

Test Plan: New tests included for the shared logic.

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D95
let svn fetches print to stdout

Summary:
As we've done recently for hg and curl, let svn print its fetch progress
to stdout, so that the fancy display can show it.

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D96
[RFC] add 'fetch exe' and 'reup exe' to plugin.yaml

Summary:
Previously we always used `fetch.*` and `reup.*` paths to invoke
plugins. That any-extension bit on the end was pretty messy, and it also
forced plugins supporting reup to have at least 2 script files (in
practice, at least 3). With this diff, `plugin.yaml` now requires the
`fetch exe` field, which defines the path that gets invoked. Plugins
that support reup will also define `reup exe`.

Those two exes can be the same script, in which case the script will
need to switch on the `PERU_PLUGIN_COMMAND` variable to figure out
whether it's doing a fetch or a reup. I actually prefer that overhead to
splitting up everything in different files, but I'd appreciate comments
on this. This diff only updates our plugins' `plugin.yaml` files; my
next diff will reorganize plugins into single scripts.

See https://github.com/buildinspace/peru/issues/45

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D97
[RFC] reorganize plugins into unified scripts

Summary:
Now that plugin.yaml has the 'fetch exe' and 'reup exe' fields (and now
that we define the PERU_PLUGIN_COMMAND variable), we can reorganize all
of our plugins into single files. Since they're all fairly small
scripts, I prefer that to creating *_shared.py everywhere. The plugins
that were already one file just get some more descriptive names, like
`cp_plugin.py` instead of `fetch.py`.

I think I like the results of this diff, but I want to hear what you
think, @sean.

https://github.com/buildinspace/peru/issues/45

Reviewers: sean

Subscribers: sean

Differential Revision: https://phabricator.buildinspace.com/D98
replace asyncio.gather with a stable wrapper

Summary:
The `asyncio.gather` function kicks off tasks in random order. That
means our modules get fetched in a random order, which isn't great. (We
went through all that trouble to allow ordered imports, after all.)
`stable_gather` is a small wrapper function around `gather` that
preserves the order of its arguments.

Test Plan:
Run a sync in the peru repo and confirm that the fetches happen in
alphabetical order. Turn our imports into a YAML list and confirm that
the fetches happen in list order.

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D99
make git, hg, and svn print something during reup

Summary:
We were printing "git fetch" and "hg pull" as appropriate during sync,
but not during reup. Creating a little helper function makes this more
consistent.

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D101
GIF!