e923b9b2

Your first flake

Adds a `flake.nix` so the project can be built, tested and checked with Nix (and run on NixCI).

It provides:

* `packages.default` — builds the dspy wheel (`python -m build`).
* `packages.test-env` — the full test virtualenv, resolved from `uv.lock` via uv2nix.
* `devShells.default` — python + uv + ruff + pre-commit development environment.
* `checks` — the package, the devShell, a ruff lint gate mirroring the existing CI,
  and **`pytest`, which runs the offline test suite (984 tests) entirely inside `nix build`**.
* `packages.impure-test` + `nix-ci.nix` — runs the *full* suite (991 tests, including
  the few that fetch real URLs) as a NixCI impure `test` job.

`nix flake check` builds every package/devShell and runs the offline test suite.