FIX: Fix init order

This addresses an issue where `on_draw` could be called before `canvas._backend` was set, which can be problematic. While fixing this and making tests more comprehensive, I also fixed an issue where `pyglet` could send more than one `on_initialize` event (whoops).

Closes #361.