Rework rendering to not redraw the entire keyboard every time
Instead of queuing a draw for the whole widget we instead only queue draws for the mutated regions when a button state changes. This requires some refactoring as the pressed buttons layout state now needs a reference to which button is being pressed.
This also gets rid of any place where buttons were previously copied.
Fixes #210