feat(knot): re-work hook handling and add shell completions
Git hooks are now run explicitly using the 'hook' subcommand and the
hook name instead of using symlinks and sniffing the invoked executable
name. Hooks are now installed as scripts in a temporary directory at
start-up, unless `--hooks` has been specified.
Signed-off-by: tjh <x@tjh.dev>