prune: strategies for linked checkouts

alias REPO=$GIT_SUPER_DIR/repos/<id>

 - linked checkouts are supposed to update mtime of $REPO/gitdir

 - linked checkouts are supposed to keep its location in $REPO/gitdir up to
   date

 - "git checkout --to" is supposed to create $REPO/locked if the new
   repo is on a different partition than the shared one.

 - "git checkout --to" is supposed to make hardlink named $REPO/link
   pointing to the .git file

The pruning rules are:

 - if $REPO/locked exists, repos/<id> is not supposed to be pruned.

 - if $REPO/locked exists and $REPO/gitdir's mtimer is older than a
   really long limit, warn about old unused repo.

 - if $REPO/link exists and its link count is greated than 1, the repo
   is kept.

 - if $REPO/gitdir's mtime is older than a limit, and it points to
   nowhere, repos/<id> is to be pruned.
gc: support prune --repos
rev-parse: add --git-dir-or-file

This returns the .git file instead of of of the resolved .git
dir. This is especially convenient for passing gitdir around when .git
is from a linked checkout. Otherwise you need to set both $GIT_DIR and
$GIT_COMMON_DIR.

--git-dir can't be changed because it has always been returned
directories.
git-completion.bash: support multi-worktree mode