Fix leaked aiohttp sessions in K8s API calls

Goal

Every kubernetes_asyncio API class (CoreV1Api(), AppsV1Api(), BatchV1Api(), ...) called with no explicit api_client argument builds its own throwaway ApiClient, which opens its own aiohttp.ClientSession/TCPConnector. None of these are ever closed, so garbage collection prints "Unclosed client session" / "Unclosed connector" warnings — most visibly during nagelfluh-bootstrap-provision (prod/runall-minikube.sh Step 3), where each bootstrap() call tears its event loop down (asyncio.run()) immediately after leaking several sessions. Fix this by sharing one ApiClient per logical unit of work and closing it explicitly, instead of leaving cleanup to the garbage collector.

Current state

Change

1. plugins/ymerflow-minikube/minikube_plugin/k8s_apply.py

2. plugins/ymerflow-minikube/minikube_plugin/cluster_provider.py

3. plugins/ymerflow-minikube/minikube_plugin/registry_protocol.py

4. plugins/ymerflow-minikube/minikube_plugin/storage_protocol.py

5. backend/services/k8s_client.py

6. backend/main.py

7. backend/services/app_deployment.py

Verification