The built-in definition uses `run-hook-with-args', and expects to get a
sensible return value out the far end. This is badly broken for two
reasons.
* The first one is that `run-hook-with-args' has an explicitly
unspecified return value, so relying on it to be anything useful is
obviously silly.
* The second is that, if the hook list isn't just a singleton, it's
not at all clear how we should choose which function's return value
to actually use.
The new code explicitly threads the address through all of the hook
functions in turn, and continues until we've had a pass where all of
them declined to change it.