Nodes marked hasChildren: true with no loaded children fetch on first expand via
loadChildren. Expand a folder: it spins, then its children spring in. Each node loads at most once.
This demo simulates a ~600ms network call and goes three levels deep.