Crash fixes, ensure we read back from valid uniform locations

* We can't use the uniform locations from our separable program as that's
  not guaranteed to be the same in the real program (could end up reading
  a completely different uniform value).
A few optimisations in cases where *tons* of LoadLibrary calls happen

* Bail if we find an IAT entry already hooked as it means this module has
  been processed already.
* Avoid allocations/std::string in the ApplyHooks function.