Performing lazy copy operations means we can end up copying a statement after it has been built and hence should no longer need its effective statements.
Add an explicit ModelProcessingPhase.EFFECTIVE_VIEW, which will run after EFFECTIVE_MODEL has been completed and the effective statement has been built.
It's execution is a straightforward children-first walk from root, just as any other processing phase.
All copy operations need to hook a prerequisite for EFFECTIVE_VIEW on their source context – which prevents it from completing – for each copied statement. That hook needs to resolve when the copy acquires the substatements.