fix(chain)!: reject changesets that alter the genesis block
`LocalChain::apply_changeset` could replace the genesis block when the
changeset contained a different block at height 0. Check genesis only
when there is no point of agreement below the changeset (the only path
that touches height 0) and extend from the existing genesis checkpoint.
`apply_changeset` now returns the new `ApplyChangeSetError`, since
`ApplyBlockError::MissingGenesis` does not apply to a chain that already
has a genesis. Replacing or removing genesis is reported as
`ApplyChangeSetError::CannotAlterGenesis`.
`from_changeset` now builds directly via `from_blocks`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>