Here are some of the more interesting design choices:
I used the empty optimization so that the DielectricMaterial would not bother trying to intersect all the other objects when the ray was inside the object. This improved the rendering time by a couple of seconds.
I tried implementing the attenuation, but something went wrong and I ran out of time. I'll try to get this up as soon as possible since I really don't want these materials to be slow! Update! I got the attenuation working and my rendering time improved by about 10x from 54 seconds to 6 seconds!
Images!
The final image
My creative image: I was not very creative and so I just put a bunch of spheres and cubes randomly on the screen.