Lots of new code

Adds GLProgramState