Add scaffolding for BidirectionalPathTrac{ingRenderer,er}

Also add scene configs that use BidirectionalPathTracingRenderer.

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

Also implement for all sensors.
Add scaffolding for PathVertex class
Generate light samples for BidirectionalPathTracingRenderer
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
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
Implement recording of more debug info for BidirectionalParticleTracer

Record per-connection unweighted/weighted contributions and
weights for level 2.
Add option to control exposure of BidirectionalParticleTracer debug images

Feature-End: bdpt-basic
Move bidirectional path weight computation into its own function

Feature-Start: bdpt-mis
Add a configuration option for bidirectional path weights

Name the current one "uniform".
Add scaffolding for MIS bidirectional path weight computation

Also add option to use MIS bidirectional path weights (with the balance
heuristic) and make bdpt scenes use it.
Add Shape.ComputePdf() method and implement for all shapes