Clean up git behaviour

 * [x] detect git repository
 * [x] make `--onto <branch>` a modifier of `--install` instead of checking out branch
 * [x] make `--onto BRANCH` default to `"deploy"`
 * [x] when git detected, use `--install --commit` as default operation (implicit `--onto deploy`)
 * [x] when committing, create branch if it doesn't exist
 * [x] merge HEAD into deploy branch as separate commit before committing artifacts
 * [x] skip merge if destination branch already up to date
 * [x] don't commit build artifacts if they are identical to the target branch's content
 * [x] update existing tests to match new behaviour
 * [x] add tests to verify new behaviour
I'm just reading, not running, but I don't see how if merge-base fails, an error message will be written, it seems like it should be run with the `execSync` wrapper. in particular, note that all the git commands used to echo, which was partially logging, but also partially an attempt at making it very clear what the tool does. Now you've added more book-keeping/info-gather calls to git, so maybe logging them all would be overwhelming, but I'd suggest that at a minimum, all git commands that actually modify the repo get logged. merge-base is among them.