This refactors how devirtualization is done in general and how multi-functions use it. * The old `Devirtualizer` class has been removed in favor of a simpler solution. It is also more general in the sense that it is not coupled with `IndexMask` and `VArray`. Instead there is a function that has inputs which control how different types are devirtualized. The new implementation is currently less general with regard to the number of parameters it supports. This can be changed in the future, but does not seem necessary now and would make the code less obvious. * Devirtualizers for different types are now defined in their respective headers. * The multi-function builder works with the `GVArray` stored in `MFParams` directly now, instead of first converting it to a `VArray<T>`. This reduces some constant overhead, which makes the multi-function slightly faster. This is only noticable when very few elements are processed though. No functional changes or performance regressions are expected.