This is a companion to the issue in quil-rs to unite the Python-bindings crate with the main crate: we should have the qcs-sdk-rust crate just generate its Python bindings via a feature flag rather than a separate crate. In the process, we'll update to the latest version of PyO3, automate type stub generation, and improve linting and CI.