Shader abstraction; miscellanious improvements

This pull request brings quite a few improvements.

The new `ShaderProgram` class encapsulates all the work involved in reading, compiling, and linking shaders, and adds a new (untested) feature to non-destructively attempt reload of those same shaders from disk.

`main()` gets an exception-handling upgrade that puts the error messages of otherwise uncaught exceptions on stderr.

And last but not least, minor improvements to .gitignore! Always a favorite :P