Implement initial version of estimateDirectLighting()

For now, implement a sampling method to just take a separate BSDF sample
for lighting.

Also add AbsDot utility funcitons.
Add SurfaceArea() function to Shape interface

Also add some utility functions to Triangle.
Move sampling functions to sampling.go

Also have them return pdf values.
Add SampleSurface() function to Shape interface
Add SampleSurfaceFromPoint() function to Shape interface
Add SampleLe() function to Light and implement for DiffuseAreaLight
handle multiple shapes
Implement GetLights() function for Primitive
Add ComputeF() function to Material
light WIP
handle
Add distribution1D
use distribution1d in light
fix distribution
use distribution for path tracing