Clean up shader handling code
Clean up shader handling code

* Attach/detach shader after loading it, instead of later during linking
* Removed shader id field; it can be a local now
* Remove redundant error checking (both caller and callee checked sometimes)
* Move attribute locations from fields to locals; this means they are
  looked up each frame even though they don't need to be, but the code
  is simpler because the locations can be local to their use
* Change the vertex buffer from an array of floats to an array of
  structs; this is much easier to read
* I also experimented with making an attribute binding object that would
  take care of getting the attribute location, enabling it, binding it,
  and disabling it. It turned out to be more code than I wanted to deal
  with right now, because it needs to be a template that handles varying
  types of attribute fields (float, float[], int, etc.).

redblobgames/helloworld-sdl2-opengl-emscripten,redblobgames/helloworld-sdl2-opengl-emscripten,redblobgames/helloworld-sdl2-opengl-emscripten