RETE relational alpha β-memory (per-sweep eval cache)

Cluster cProfile (combined_40_ings, eos v0.5.423) showed
alpha_network.activate at 5.36s cumtime as the residual hot spot
after the v0.5.420-423 micro-optimizations. Phase 0 falsifier
(commit 99ded2911) measured RelatedNodeAlpha at 84.7% noop ratio
on the two_origins fixture — 17K of 20K activations end with the
predicate output unchanged. The existing _eval_cache short-circuits
PROPAGATION but evaluate() itself still runs on every call.

This release adds the textbook β-memory pattern (cache the join
result keyed on a generation that advances when inputs change) to
the two relational alpha types whose evaluate() bodies do
non-trivial per-related-uid work:

- 420f88d20  perf(rete): per-sweep eval cache on RelatedNodeAlpha
- 7797eb2f9  perf(rete): per-sweep eval cache on CrossNodePropertyAlpha

Mirrors the proven PerRelatedNodeAlpha._source_eval_cache pattern.
Within a sweep the working memory's cache_generation is fixed, so
repeat activations on the same source uid would walk the same
related set, do the same filter loop, produce the same quantifier
reduction. Cache short-circuits before evaluate() runs.

Local cProfile (test_benchmark_two_origins): alpha.activate calls
53K → 33K (-38%); cProfile total 1.295s → 1.146s (-12% cumtime).
Wall-clock at this fixture size is within macOS scheduler noise;
combined_40_ings is the target.

Cancel-rehab cleanup is automatic — `reset_gfm_activation` already
pops `_source_eval_cache` via hasattr branch.

Tests: 532/532 green. CO2 invariant test_benchmark_two_origins=1.2568
holds. The branch perf/beta-discrimination was created to scope this
work and is preserved on origin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>