Changes are now tracked per-uniform, allowing more updates to be skipped.
The buffers used in a program are cached, making the no-changes case
faster.
Additionally, Program now creates a UniformBlockInfo struct for the
default uniform. The program-wide uniform layout hash has been repurposed
to cover the entire program.