composite: renders children in order — measureHeight sums recursively (in case a stack nests
another stack/section); render does per-child ensureSpace itself (like the top-level
engine.render loop), because text/spacer/divider/image don't call ensureSpace themselves —
without this, a child that overflows the page in the middle of a stack wouldn't break and
would draw over the footer or spill off the page
composite: renders children in order — measureHeight sums recursively (in case a stack nests another stack/section); render does per-child ensureSpace itself (like the top-level engine.render loop), because text/spacer/divider/image don't call ensureSpace themselves — without this, a child that overflows the page in the middle of a stack wouldn't break and would draw over the footer or spill off the page