GLProgram should not abort() if shader compilation fails, returning false is better.

GLProgram should not abort() if shader compilation fails, returning false will allow app to show custom error message to user (or use other simple shaders if a complicated shader fails to compile on some device).

As we are not aborting, destructor needs to check for and delete shader elements.