Move some logic inside the program manager

Still have to figure out what should be responsible for drawing:
ProgramManager, Program, GLContext, ...