Let's add boolean isPreviewed() to ModuleItem, and boolean preview() default true; to Parameter, which control whether each individual parameter calls the preview() method after it changes.
Note that in cases where parameter foo triggers a callback which changes bar, but foo declares preview=false, this will not trigger a preview even though bar also changed, because callbacks and previews do not chain. It is the responsibility of the programmer to keep track of such "parameter dependencies" and structure things as needed for their use case.
Thanks to Adrian Daerr for the suggestion.