Deduplicate code in shape.rs with some macros.
Implement PrivateShape with generics instead of macros.
Fix: Plane normal's length was not 1.
Fix: shadows were casted by objects behind the light source.
Fix: the back of a Diffuse material should be black.
Fix: the back of a DiffuseMaterial was reflecting the lights on its front.
Implement a ReflectiveMaterial.
Use a better, simpler way to avoid shadows 'cancer'.
Implement a RefractiveMaterial.
Fix: intersection with a sphere was broken when the ray was inside the sphere.