refactor Shader, Source and Program to use Observer pattern