Reduce BaseHookCollection API.

We don’t need all array methods.
Move hook selection into base hook collection.
Remove unnecessary helper method.
Combine filtering and running hooks into a single method.

Before, these things were split into separate methods (`for` and `run`),
even though they are never needed individually. The split caused us to
create extra unnecessary instances of `HookCollection` in order to
maintain the extra state between `for` and `run` without mutating the
existing instance.

The allocation benchmarks show that this reduces the number of objects
created per example group by 2 arrays and 2 HookCollection instances.
Move method def to be nearer to similar methods.
Refactor around hook execution.