Implement contribution computation from light super-vertices

Use it to make BidirectionalPathTracer do basic path tracing.
Implement recording of debug info for BidirectionalParticleTracer

Record per-edge-count contributions for now.
Record path lengths for BidirectionalPathTracer for debug level >= 1
Implement contribution computation from surface and light interactions
Include contributions from most combinations of light/sensor subpaths
Record more debug info in BidirectionalPathTracer

Feature-End: bdpt-basic
Keep track of bidirectional weight incrementally

Feature-Start: bdpt-incremental-weights
Implement PathVertex.ComputeWeight()
Use PathVertex.ComputeWeight() instead of counting paths directly

Check the weight against the path count.

Feature-End: bdpt-incremental-weights
Add PathVertex.IsSpecular() method and use it in BidirectionalPathTracer

Feature-Start: bdpt-light-contributions
Add an option to record light contributions for BidirectionalPathTracer

Leave it off for all BDPT scenes for now.
Add scaffolding for handling light contributions in BidirectionalPathTracer
Implement contribution computation from sensor super-vertices
Add Sensor.ComputePixelPosition() method and implement for all Sensors
Relax restrictions on Sensor.ComputePixelPosition()
Implement contribution computation for sensor vertices
Make all BDPT scenes record light contributions

Feature-End: bdpt-light-contributions