refactor(grpc): dedupe block_ref lookup, hoist era summary, fix double decode
Addresses review feedback on the per-UTxO block_ref population added in the previous commit: - Introduce `AsyncQueryFacade::block_meta_by_tx_hash` returning chain-point metadata (`BlockRefMeta`) decoded once inside the blocking task. Eliminates the redundant `MultiEraBlock::decode` previously performed in the gRPC caller. (review A-01) - Hoist `load_era_summary` to the request handler scope via a new shared `serve::grpc::block_refs` module. Previously `get_slot_timestamp` reloaded the era summary from state on every UTxO; now it runs once per request. (review A-02) - Deduplicate block lookups by source tx hash. A `search_utxos` page whose UTxOs cluster on M unique txs now does M lookups instead of N. (review A-03) - Propagate storage failures as `Status::internal` instead of swallowing them. Block-decode failures (indicating archive corruption) degrade to `debug!` rather than per-UTxO `warn!` log spam. (review A-04, A-05) - Extract the entire flow into `serve::grpc::block_refs::fetch_block_refs`, shared by both v1alpha and v1beta. Each version maps the chain-agnostic `BlockRefData` to its own proto-specific `ChainPoint` via a tiny `to_chain_point` helper. (review A-06) `into_u5c_utxo` now takes the pre-resolved `Option<ChainPoint>` as a parameter rather than performing its own lookup, keeping the per-UTxO path cheap. Tests deferred: no harness exists for `read_utxos`/`search_utxos`. The `minibf::TestDomainBuilder` pattern can seed a `ToyDomain` via `import_blocks`, and `FaultyToyDomain` covers error branches — happy to add unit tests if maintainers prefer them in-PR.