Add ARB_program_interface_query function calls and convenience methods

Fixes #267

I've done some rough testing, so it (and especially the convenience methods) should be working fine.
I wouldn't argument with processor ticks but rather with program comprehension (an if statement that is most likely false will most likely be predicted correctly by the branch prediction).

I asked myself if your code can break somehow if the requested string is empty or non-existent (e.g. a string pointing to a null pointer will break the program).
Then I validated your code and it will not break...

So I'm just curious if there is a real cause to omit a guard clause.