ci: enforce stub freshness in CI, fix existing stub drift (#2912)
* ci: add stub freshness check to CI
The generate:stubs mise task and stub:check already exist but weren't
enforced in CI, so .pyi stubs could drift when Rust source changed.
Adds a check-stubs job that runs `mise run --force stub:check` on Rust
changes, using --force to bypass sources/outputs mtime freshness (which
would skip regeneration in CI's fresh checkout).
* chore: regenerate coglet Python stubs
Stubs drifted after the BuildInfo.dirty field was added in #2829 and
docstring updates in recent PRs. Regenerated with `mise run generate:stubs`.
* fix(ci): set LD_LIBRARY_PATH for stub_gen in check-stubs
stub_gen is a PyO3 binary that dynamically links libpython. setup-uv
installs Python to a non-standard path, so the shared library isn't on
LD_LIBRARY_PATH by default. Query sysconfig for the correct LIBDIR.
* fix: restore dict[str, str] return type for Scope.context stub
Regression from #2853: the context property returns Py<PyDict> which
pyo3-stub-gen infers as bare `dict`. Add an override_return_type
annotation so the generated stub preserves the intended dict[str, str]
contract.
* fix(ci): use setup-python for shared libpython in check-stubs
stub_gen needs libpython3.x.so at runtime (PyO3 auto-initialize).
setup-uv's python-build-standalone is statically linked and doesn't
ship the .so, causing 'cannot open shared object file' at runtime.