Split entsoe (generic ENTSO-E client) and backcasting (Balmorel validation) into separate packages

pybalmorel.entsoe originally held both raw ENTSO-E fetching and all Balmorel-comparison/validation logic (load/price/generation alignment, XKFX Observed Max Flow overrides, plotting). We split it into two packages: pybalmorel.entsoe, a generic client for the ENTSO-E transparency platform with no knowledge of Balmorel results, and pybalmorel.backcasting, which depends on entsoe (and on pybalmorel.MainResults) to validate simulated Balmorel behaviour against ENTSO-E observations for a historical year.

entsoe keeps bidding_zone_translation (the Balmorel-region ↔ ENTSO-E canonical-zone bridge, “Canonical Region Name” in CONTEXT.md) even though it only has a consumer inside backcasting today. This is deliberate: the table translates ENTSO-E regions into Balmorel’s naming, which is exactly the kind of zone-code knowledge other, non-backcasting consumers of raw ENTSO-E data for Balmorel regions would also need — keeping it in entsoe avoids forcing every such consumer to depend on the backcasting-validation package to get at it. region_to_entsoe_code, entsoe_subzones, and entsoe_code_to_region moved from flows.py into entsoe for the same reason: they operate purely on zone-code tables, with no Balmorel-scenario or XKFX logic in them.

entsoe has no CLI yet — backcasting owns the CLI (python -m pybalmorel.backcasting ...) entirely, since every existing command (format, statistics, generation, prices, transmission-max-flow) is validation/comparison logic. A standalone entsoe-only CLI for downloading raw data scoped to Balmorel bidding zones is plausible future work, tracked as a TODO in entsoe/__init__.py, not built now.

The rename is a clean break: pybalmorel.entsoe.format/statistics/generation/prices/transmission-max-flow and their CLI invocations move to pybalmorel.backcasting with no re-exports or deprecation shims, since this functionality is unreleased (feature branch, not on PyPI).