Abstract class that handles creating a window, initialising an OpenGL context, and receiving mouse and keyboard input.