Correctly propagate deserialization errors from `HloProgramSerDes`
Correctly propagate deserialization errors from `HloProgramSerDes`

`mlir::stablehlo::deserializePortableArtifact` returns nullptr if parsing fails, which we need to handle explicitly. Also, `ScopedDiagnosticHandler` is used to propagate error messages from MLIR to the caller.
