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 option to BidirectionalPathTracer to check computed weights

Use it to control the weight-checking already done.

Feature-Start: bdpt-check-weights
Store pFromNext values in PathVertex

This is in preparation for using them to check the incremental weights.
Implement PathVertex.ComputeExpectedWeight()
Compute expected weights and compare them to incrementally-computed weights

Feature-End: bdpt-check-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
Add Light.SampleLeSpatialFromPoint() method and implement for DiffuseAreaLight

Also rename Light.ComputeLePdfFromPoint() to Light.ComputePdfFromPoint().

Feature-Start: bdpt-direct-lighting
Add PathVertex.SampleDirect() method and implement direct light sampling
Add an option to use direct lighting for BidirectionalPathTracer

Leave it off for all BDPT scenes for now.
Use direct lighting in BidirectionalPathTracer when directed to
Turn on direct lighting for most BDPT scenes

Feature-End: bdpt-direct-lighting