Cleanup uses of reinterpret_cast

There are still quite a lot of uses, but I believe the remaining ones are ok. There are two forms of cast that I've changed:

* Casts between `void*` and some other pointer type. Usually done to cast the return value of an allocation function some specific pointer type, and sometimes (in FileSourceZip) to prevent the type leaking into the header. I think these should be `static_cast` because `static_cast` is well defined for this operation; we don't *need* `reinterpret_cast` here, so we shouldn't use it.
* Casts from `Body*` to a derived class. Casting to jump around the class hierarchy should always be done with `static_cast` or `dynamic_cast`. Using `reinterpret_cast` for this is a potential source of bugs.