Using `printf` in place of `echo` throughout program

printf is more portable and more explicit
Usinng more idiomatic option handling.
Updating option handling to work more nicely with tasks

Setting arguments and options to arrays that are then used in each
individual task, rather than hard-coding options at the program level.

Also adding a `raw_options` variable containing the entire option
string, which is currently used by the git command to preserve the
options for passing to the git program.

This new approach also prompted a new version of `_contains()`, which
should work better since it iterates through the array.

Multiple locations in the code needed to be updated for all of these
changes.