Messing around with a more functional shader API. I really don't know which direction to take it in yet.

NOTE: building this version WILL fail. Bad practice to commit, I know, but I just need to save it. Next commit will be a working version.