perf(preg,nongaussian,did,sv,garch): [T090] micro/panel hot-loop batch — output bit-identical (#189)

- SUB-1 (preg): new `_group_index_map` — one O(N) forward pass replaces the
  per-group `findall(==(g), ids)` rescan (O(G·N) -> O(N)) at all 13 sites in
  preg/estimation.jl (_within_demean, _within_demean_matrix, _twoway_demean!,
  _between_regression, FE/RE/CRE/FD group loops). Buckets fill in ascending
  index order == findall output, so every group mean and demeaning write is
  bit-for-bit unchanged (unit test pins the identity).
- SUB-2 (ICA): `_distance_covariance!`/`_hsic_statistic!` buffered kernels —
  the dcov/HSIC objectives reuse one set of T_obs x T_obs scratch matrices
  across all pairs and NelderMead evaluations, and the invariant HSIC
  centering matrix H = I - ones/n is hoisted out of the objective. DELIBERATE
  SPEC DEVIATION: the spec's in-place double-centering + Frobenius inner
  product is mathematically equal but NOT bit-identical in floats to H*K*H /
  tr(Kc*Lc); to honor the hard "numerical output unchanged" constraint the
  products keep the same mul! calls/associations as before — the win is
  allocation elimination (~6 n x n allocations per pairwise call -> 0).
  Tests pin new == old-formula-inlined to full bit equality.
- SUB-3 (DiD): Callaway-Sant'Anna nested Dict{Int,Dict{Int,T}} panel lookup
  replaced by a dense (unit x time-position) matrix + BitMatrix presence mask
  (integer indexing in the cohort x time x unit triple loop); BJS FE
  fixed-point sweeps use ctrl_by_time/ctrl_by_group index buckets (O(n_ctrl)
  per sweep instead of O((T+G)·n_ctrl)) and the (cohort,time) cell
  aggregation reads a treated_by_cell bucket instead of scanning 1:n_treat
  per cell. Ascending bucket order preserves accumulation order exactly.
- SUB-4 (SV): Gibbs h-draws stored into a transposed (n x n_samples) buffer
  with contiguous column writes, transposed once (permutedims) to the public
  (n_samples x n) shape after the loop — pure data movement, bit-identical
  draws, forecast.jl indexing unchanged.
- SUB-5 (GARCH): GARCHModel/EGARCHModel/GJRGARCHModel gain a trailing
  `param_vcov::Matrix{T}` caching the QMLE sandwich covariance (optimization
  space) computed ONCE at estimation; stderror reads the cache instead of
  recomputing the O(k²)-filter-pass numerical Hessian on every call
  (report()/confint repeat calls were re-deriving it each time). 17-arg
  back-compat outer ctors keep hand-built models compiling; their NaN cache
  routes stderror through the old recompute path, and the test pins cached
  SEs == recomputed SEs exactly. :hessian cov_type recomputes as before.

Tests: test_panel_reg (+SUB-1 identity/equivalence), test_panel_iv,
test_panel_nonlinear, test_nongaussian_internals (+SUB-2 bit-equality),
test_nongaussian_svar, test_did 457/457 (+SUB-3 manual-Dict equivalence),
test_volatility (+SUB-4 determinism/shape, +SUB-5 cache==recompute),
test_volatility_coverage — all green.
