Split stacker service.py into ops/pr/cherry_pick/render/commands subpackages
Breaks the 2,025-LOC StackerService god class into focused modules
following gitstack's CommandCtx pattern:
- ctx.py StackerCtx bundles db/paths/progress/pr_backend/git
- ops/ init, track, remove, reparent, split, rename, sync, push,
continue_abort, guard, worktree — one file per operation
- pr/ config, resolve, find, lineage, create_update, stack_block
- cherry_pick/ driver, resume, empty (local cherry-pick state machine)
- render/ status, log, ls, graph, format
- commands/ one-file-per-CLI-command argparse wiring
- gc.py gc_ops moved out of cli.py (re-exported for back-compat)
service.py shrinks to a 248-LOC public facade (no private passthroughs)
and cli.py to a 9-LOC dispatcher. git.py gains a GitClient Protocol +
SubprocessGitClient impl, symmetric with the existing PRBackend seam.
Introduces LsOptions, PrContext, DriveHandle, GraphPos dataclasses so
every function stays under the 5-arg limit; drops redundant repo_name
from drive_local/finalize_local_op (use op.repo_name).
Test impact: 5 files rewritten to import public module functions instead
of poking service._foo; 3 files switched monkeypatches to target
ops.worktree.run_single_pp at module scope; 1 file updated for
_resolve_create_slot / _resolve_repo / _resolve_branch relocations.
CLI help output is byte-identical to pre-refactor.