Run fmt, clippy, tests, and rustdoc on both hosts
Two runners on purpose. The CSR tests verify our output through openssl rather than through our own parser, and the hosts ship different ones: ubuntu has OpenSSL 3, macOS has LibreSSL, and they disagree about which stream the verify banner goes to. That difference already cost a debugging round locally, so a single-host matrix would let the same class of bug through unnoticed. macOS is also where this crate's signing work has to run eventually, since keychain access exists nowhere else. fail-fast is off because when a test fails on exactly one host, that asymmetry is the most useful part of the report. The rustdoc job pays for itself immediately: it found a link to a `KeyPair` type that does not exist, in the paragraph explaining that a lost private key is unrecoverable. The intra-doc links carry real weight here, since the certificate module's warnings point at the csr module that explains them, and a broken one drops that thread silently. Also fixes a pre-existing unclosed `<key-id>` HTML tag in the CLI's help text, which rustdoc reads as a tag rather than a placeholder. openssl version is printed before the tests because it decides how the CSR verification behaves and changes under us whenever GitHub bumps runner images. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PGeEFM4hBGSZYXjFWguaWa