Use `Path` from stdlib for manipulating paths

This way we can leverage the compiler to make sure we're doing thing's
"better" (tm).

This also introduces possible_alternatives for generating a list of
possible executables. The idea is that the first one that exists will be
called, so paths get gradually less-specific