Refactor hooks

Before this PR, the code supporting before, after, and around hooks uses classes that inherit from Array and extend individual Proc objects. This PR converts those into wrapper classes that delegate off to the wrapped arrays and procs.