Small immutable budget struct for recursive/subagent work.
@type t() :: %Vibe.Budget{ depth: term(), max_children_per_node: term(), max_depth: term(), max_total_agents: term(), max_wall_time_ms: term(), started_at: term() }
@spec allowed?(t()) :: boolean()
@spec child(t()) :: t()
@spec elapsed(t()) :: non_neg_integer()
@spec new(keyword() | map()) :: t()