Re-implemented fading to fix some memory issues

For beter accuracy, implemented screen fading in terms of a screen-wide effect that is applied via a fragment shader. This allows for more NES-like color fading if desired.

This also fixes an issue with the task queue/substate thing that causes SEGFAULTS due to undefined behavior in GCC/Clang. It's a miracle that it worked at all, really.

Also fixed is the issue where the stage would start twice after you've died and returned to a stage via stage-select.