Redesign interface of shader and shader_program.

It is mostly backwards compatible, so don't worry.