Typed AST over tree-sitter-bash.
tree-sitter gives back a stringly-typed CST (node.kind() == "command"); this crate
converts that into a Rust enum tree so downstream consumers (permission rules,
linters, refactors) can pattern-match instead of comparing strings.
The typed surface mirrors tree-sitter-bash's node-types.json one-to-one: every
named node kind has a corresponding variant. Conversion is total — an unrecognized
node kind returns [ParseError::UnknownNode] rather than being silently dropped.