diff: add a `--tool` flag to use external diffing tools

Diffing using an external tool is a very important use case and used a lot.
Currently in mercurial the only way to do so is to use the extdiff extension.
This approach is not extendable as extdiff kind of rewrites all the diff logic
and plug in it's specific things. Also that can be re-used in other commands.

This patch introduces a `--tool` flag to diff command which we be added by
extdiff extension. It wraps the core diff code and is extensible.

Also having `diff --tool` is better UI than `extdiff`, something which I like in

In future, I will like to refactor existing extdiff logic to use `diff --tool`
logic. But before that, I am more interested in adding external tool
functionality to all places where we show a diff, for example: export, log etc.

Differential Revision: https://phab.mercurial-scm.org/D8972
11 jobs for topic/default/extdiff-refactor in 30 minutes and 52 seconds (queued for 26 minutes and 10 seconds)