Leios: add Maybe LeiosCert on DijkstraBody (Dijkstra-only)
Re-authored on top of c175b1b317 (the cardano-ledger commit compatible with consensus main's CHaP index-state 2026-04-13) to match the older fat-constructor DijkstraBlockBody shape (pre-memoization refactor). Equivalent to b6b2feb006 on leios-prototype-remake, which targeted the post-memoization shape (DijkstraBlockBodyRaw + lensMemoRawType). Adds: * `dbbLeiosCert :: StrictMaybe LeiosCert` field and matching `dbbLeiosCertBytes :: Maybe BSL.ByteString` byte-cache, mirroring the PerasCert pattern in this older shape. * `LeiosCert` placeholder newtype over ByteString with derived EncCBOR/DecCBOR/NoThunks/NFData (the real type lands with the Leios voting machinery). * `leiosCertBlockBodyL` lens method on `DijkstraEraBlockBody`. * Pattern synonym extended with a third `StrictMaybe LeiosCert` arg; body threads the bytes through `hashDijkstraSegWits` (now takes the Leios bytes arg too). * `EncCBORGroup` appends the optional Leios cert bytes after the optional Peras cert bytes. * `DecCBOR` handles three list-length cases: 4 (neither), 5 (Peras only, legacy), 6 (Peras + Leios). A Leios-only encoding is not expressible without ambiguity at len 5 \-- intentional: Dijkstra-era blocks aren't on the wire yet. * `NoThunks` `AllowThunksIn` list extended with `dbbLeiosCertBytes`. * Testlib: `Arbitrary LeiosCert` (and `DijkstraBlockBody <*> arbitrary <*> arbitrary <*> arbitrary`); `ToExpr LeiosCert` and updated `ToExpr (DijkstraBlockBody era)` constraint set. Only the Dijkstra era is Leios-enabled \-- earlier eras are untouched. Verified: `cabal build cardano-ledger-dijkstra:lib:cardano-ledger-dijkstra` and `cabal build cardano-ledger-dijkstra:lib:testlib` both clean. Co-Authored-By: Claude Opus 4.7 <[email protected]>