Found it! Check out AUParameterObserverToken. It's used kind of like this:
AUParameterObserverToken token;
token = [myAudioUnit.parameterTree tokenByAddingParameterObserver:^(AUParameterAddress address, AUValue value)
{
fprintf(stderr, "Got knob turn \o/ %d = %f\n", (int)address, (float)value);
}
];
It's really easy to get lost in these headers, and to get sidetracked thinking maybe it has something to do more directly with implementorValueObserver or other blocks. At the end of the day, it does make some sense that it would be a property of the tree or parameter object itself. But, It would be helpful if some of the other parameter-related docs steered the user towards this and if the official AUv3 host example implemented it as well.