ChainstateManager creates and owns its BlockManager which means block storage can't exist without chainstate management. Validation also reaches BlockManager's members through friend declarations. In #35627, moving that ownership out of ChainstateManager which came up as worthwhile doing.
ImportBlocks gets BlockManager::SetBlockfilesIndexed() for the reindex flag and moves to node/chainstate, since it drives validation. RequestPrune() and MarkBlockIndexDirty() replace the friend declarations, keeping the prune check flag private. NodeContext and the kernel then create the BlockManager first, pass it to ChainstateManager by reference and destroy ChainstateManager first. Last, ChainstateLoadOptions::prune is removed, since every caller set it from the BlockManager's prune mode.
The only behavior change to my knowledge is startup log order, because the block tree database opens before the script verification threads start.
Based on #36738
Thanks to musaHaruna for his review on my fork, which suggested RequestPrune().