delete_collection returns before the apiserver actually removes
objects — finalizers on PVs, PVCs, and pod graceful shutdown all
propagate async. Add _wait_for_labeled_deletions that polls the
same label selector across every kind we triggered a delete for,
with a 120s timeout. down() now returns only once the cluster has
actually settled, so callers (tests, ansible, cryovial) don't
need their own wait loops.
Update the k8s-deploy test's assert_no_labeled_resources to rely
on that synchronous contract — no polling in the test.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>