Here's another update to the game. In this stage my main focus was decreasing lag in the collision detection and hopefully reducing the number of exceptions and incorrect behaviour.
To do this my main improvement was to calculate the angle of the ball periodically in the background, rather than on demand at the time when a collision with the cushion occurred. This works very well most of the time, except in the case where the angle needs to be calculated very soon after a ball is hit (especially when a ball is resting on the cushion).
The other main enhancement was to combine three lines of code into a single calculation in the method that handles collisions with the cushions. This worked surprisingly well.
I also slowed the ball movement down a bit which buys me a bit more time.
There's still a few problems, caused mainly by lag, but I'm not sure I can get much more improvement. Enjoy