shader: avoid loading shaders multiple times by adding a waiting queue for other shader instances requiring the same shader object.
shader: add GetShaderId() API.
material: use cache to avoid generating redundant gl programs.