Elegant!
You might want to brush up the bouncing algorithm a little. It seems that the balls are checked for collisions in some arbitrary order and respond before the entire array is checked so that, at times, when two balls collide, only one responds as might be expected.
Otherwise, I like it! More minimalistic than simple, I feel, and a really great idea!