Combine {Path,Particle}TracerPathType into TracerPathType

Add scaffolding in {Path,Particle}Tracer for handling "non-native"
path types.

Create new tracer.go file to hold common functionality between
PathTracer and ParticleTracer.

Also add new TracerContributionType type and use it.

Feature-Start: unify-tracers
Add utility functions to TracerPathType and use them in {Path,Particle}Tracer
Add TracerPathType.HasAlternatePath() function and use it

This moves the path calculation logic in one central place.
Combine {Path,Particle}TracerWeighingMethod into TracerWeighingMethod
Combine {Path,Particle}TracerRRContribution into one type
Combined {Path,Particle}DebugRecord into TracerDebugRecord
Combine {path,Particle}Record into TracerRecord

Make it have a contribution field and an Accumulate() method that
uses it to accumulate correctly.

Feature-End: unify-tracers
Add TracerWeightTracker class for {Path,Particle}Tracer to compute weights

Feature-Start: tracer-weight-tracker
Make PathTracer use TracerWeightTracker
Make ParticleTracer use TracerWeightTracker

Feature-End: tracer-weight-tracker
Implement TwoWayPathTracingRenderer

Feature-Start: twpt-basic
Add TwoWayPathTracer versions of all scenes
Make TracerWeightTracker keep track of q (backwards probability) values
Add TracerPathType.ComputePathCount() method to be used for testing
Take into account backwards paths in PathTracer when using uniform weights

Check uniform weights against PathTypes.ComputePathCount() in
PathTracer.
Take into account backwards paths in ParticleTracer when using uniform weights

Check uniform weights against PathTypes.ComputePathCount() in
ParticleTracer.

Feature-End: twpt-basic
Check q vertex count in TracerWeightTracer

Feature-Start: twpt-proper-weight-tracking
Track backwards path probabilities properly in PathTracer
Track backwards path probabilities properly in ParticleTracer
Move weight-related computations into their own functions in PathTracer