Add scaffolding for BidirectionalPathTrac{ingRenderer,er}

Also add scene configs that use BidirectionalPathTracingRenderer.

Feature-Start: bdpt-basic
Add scaffolding for PathVertex class
Add Sensor methods to sample/compute spatial and directional We seperately

Also implement for all sensors.
Add light/sensor super-vertex and vertex types to PathVertex

Also implement PathVertex.SampleNext() for light/sensor super-vertices
and add validation functions.
Implement PathVertex.SampleNext() for light vertices

Also add surface interaction vertex type.
Implement PathVertex.SampleNext() for sensor vertices
Implement PathVertex.SampleNext() for surface interaction vertices

Also add MaterialTransportType field to PathVertex.
Implement custom PathVertex.String() method

Also implement MaterialTransportType.String().
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 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()