feat(root): PTY_ROOT canonical + --root flag + per-root gc plist (#55)
Phase-2 per-namespace isolation. `PTY_SESSION_DIR` becomes a legacy
alias (still functional, emits a one-time deprecation notice per
process; suppress with PTY_ROOT_LEGACY_SILENT=1). New canonical env
`PTY_ROOT` and matching global `pty --root <path>` flag pin the
state registry per call — every subcommand transparently scopes
via getSessionDir().
`pty gc --print-launchd-plist` parameterizes off the current root:
default root keeps the pre-Phase-2 Label (com.myobie.pty.gc) for
backwards compat with existing installs; non-default roots get a
sanitized Label suffix (com.myobie.pty.gc.<basename>) and a per-root
log path (<root>/gc.log). Emitted plist writes PTY_ROOT (canonical),
not the legacy name — a mid-migration installer sees loud stderr in
gc.log until it's cleaned up.
README gains a "Namespaces" section documenting soft (tag-filter)
and hard (--root/PTY_ROOT) isolation. smalltalk's Phase-1 `st.network`
tag composes with this cleanly.
Tests in tests/pty-root.test.ts cover: env-var precedence, one-time
deprecation notice + silence hatch, --root overrides both envs,
--root value validation, default vs non-default plist Label,
per-root logPath, pathological-basename sanitization.