Add method for incompatibilities between virtual and base packages
Add a new method to add a single custom incompatibility that requires the base package and the proxy package share the same version range.
This intended for cases where proxy packages (also known as virtual packages) are used. Without this information, pubgrub does not know that these packages have to be at the same version. In cases where the base package is already to an incompatible version, this avoids going through all versions of the proxy package. In cases where there are two incompatible proxy packages, it avoids trying versions for both of them. Both improve performance (we don't need to check all versions when there is a conflict) and error messages (report a conflict of version ranges instead of enumerating the conflicting versions).
There's several usage patterns for this method. The basic one is upon encountering a dependency on a proxy package with a range, using this method with its base package and that range.
Allow multiple self-dependencies
In uv, we don't use the `DependencyConstraints` map, but pass in the dependencies through an iterator. This means there can be duplicate dependencies in the input. This would previously make `merge_dependents` panic if a package dependent on itself twice with the same range:
```toml
[package]
name = "foo"
version = "0.1.0"
dependencies = ["foo", "foo"]
```
The fix is to ignore self-dependencies when merging dependents, given that they are always trivially true or trivially false.
Give the GitHub token write permissions
Without the default write permissions the job otherwise fails, see https://github.com/astral-sh/pubgrub/actions/runs/14617176327/job/41007947575