fix(database): treat BlockByHash index miss as hard miss
The legacy iterator-fallback in BlockByHashTxn ran a full block-blob prefix scan on every hash-index miss, dominating fork-resolution CPU during preview catch-up (11.2% cum, 370 MB/min churn — issue #2105). Hash-index entries are written for every block since #1915, so a miss on a healthy DB means the hash is unknown to us. Returning ErrBlockNotFound directly lets findPeerForkPath rotate to the next peer without a worst-case scan. Real backend errors are still surfaced. Add atomic hit/miss counters (BlockByHashStats) so operators can track the false-fallback rate and decide whether a pre-#1915 index back-fill is needed — exactly the metric the issue asks for. Signed-off-by: SAY-5 <[email protected]>