Refactor code to remove reliance on undefined behavior.
Previously, the code got away with a c-style reinterpret_cast
in a constexpr function, which is not allowed according to the
standard. I think I was just lucky that the compiler didn't saw
through that yet.
Also, the code assumed (and enforced) that all function pointers
are sizeof(void*), which worked, but was a bit clunky.
Now, we simply get rid of the list of addresses, and iterate
manually over all hooks. With C++17's apply, this could be implemented
even nicer with a tuple and std::apply. That doesn't exist yet, so
we manually call the functions.