Abstract away more details of shaders into structs …
This allows RenderContext to not care about more details of programs in preparation for supporting more varieties.