_git: push: option is called --set-upstream and not --set-upstream-to
_git: status: offer -b,--branch when --porcelain or -z are given

--porcelain and -z don't show the branch info by default, so it
is needed to offer --branch for those options, too.
_git: fix __git_committish_range_{first,last} and __git_is_committish_range

- Ranges with 3 dots would always fail, because the non-greedy
  expansion  %..(.|)* in __git_committish_range_first would only
  remove '..' and never three dots. 'a...b' would end up in 'a.'.
  Use ${${1%..*}%.} instead.
- Use a similar approach for __git_committish_range_last.
- Wrap them in another expansion to replace empty results with 'HEAD'.
  Git man-page states omitted range ending are being replaced with
  HEAD. This rule has to be followed to make completions like
  'git log HEAD.. -- <tab>' work properly.
- Add an additional check to make sure none of the extracted first/last
  parts contain additional '..' in invalied ranges such as 'a..b..c'.
  This gets rid of the 'TODO:' and ideally saves a few unneded
  calls to git rev-parse.
_git: refactor and fix git diff completion

Before this, there were several cases where the completion
would offer the wrong things:

$ git diff branch -- <tab>

would try to complete "changed in workdir files", but needs to
complete all "tree files in HEAD".

$ git diff --cached -- file1 file2 <tab>
would try to complete "changed in workdir files" but needs to
complete "changed in index files".

...

After this change all possible combinations are taken into
account and completion should work properly.
_git: __git_files: do not pass $PREFIX to ls-files, breaks matcher-list

When getting file lists from git-ls-files, do not pass the
typed $PREFIX, because this breaks the matcher-list zstyle.

There is no need to pre-filter the results that strictly when
calling ls-files, beause the results are passed to _multi_parts
which deals with that anyways.

Example:

- Modifications to files dir/FIRST.txt and dir/SECOND.txt in a git repo
- matcher-list zstyle set to ignore case: m:{a-z}={A-Z}
- Attempt to complete: git checkout -- dir/f<tab>
- Before this fix: git-ls-files is called
    git ls-files -z --exclude-standard --modified -- 'dir/f*'
  and returns nothing, because it does not know of zsh's matcher-list.
  No completions are offered, even though matching should work
  case-insensitively.
- After this fix: git-ls-files is called
    git ls-files -z --exclude-standard --modified -- 'dir/*'
  which returns (dir/FIRST.txt dir/SECOND.txt).
  All results are then passed to _multi_parts which deals with the
  actual completion, taking into account the matcher spec,
  and correctly offers the matching result
    FIRST.txt