Abstract out function to copy uniform values between programs

* This needs to be refactored to use the program interface query API so
  we can get the location of uniform blocks and set them
* We also need to copy over sampler uniform values (getting away with it
  for now as we're generally replacing the pixel shader, so there aren't
  any samplers used in the cases I've tested).
Implement viewport/scissor and depth/stencil test overlays for GL
Do NaN/-ve/inf checks before range application, feels more consistent

* Before, we'd remap the visible range (if the range was 0.25-0.75 this
  meant 0.0 would be mapped to 'negative') before checking on negative
  values, which didn't feel like the right thing for the overlay to show.