Add plenum ModelObject classes

The basic AirLoopHVACSupplyPlenum and AirLoopHVACReturnPlenum classes
have been added.  At this point they can be constructed, but they are
not yet part of the AirLoopHVAC topology therefore they are not yet
functional.

[#63321724]
Implement AirLoopHVACSupplyPlenum::addToNode

addToNode is the main worker method for inserting a plenum into an
AirLoopHVAC structure.  This is a complete method with tests.

[#63321724]
Implement AirLoopHVACReturnPlenum::addToNode

Like AirLoopHVACSupplyPlenum::addToNode, this is the basic mechanism for
adding return plenums to an AirLoopHVAC topology.  This implementation
is complete with tests.  More convenient methods will be added to the
API on top of this.

[#63321724]
Implement AirLoopHVAC::addBranchForPlenums

[#63321724]
Add tests for creating plenum branches
Refactor Loop::demandComponents

Factored out a function to trace the components between demand splitter
and mixer in preparation to make this call recursively when there is
plenum system between the main splitter and/or mixer.
Generalize (partially) HVAC topology tracing

This work treats HVAC topology as a graph and uses a generic recursive algorithm
inspired by the Ford–Fulkerson algorithm to trace HVAC all HVAC
components between source and sink.  This algorithm is still being
developed and implemented behind the existing API like
Loop::demandComponents() but should make implementation of this code
much cleaner.

http://en.wikipedia.org/wiki/Ford–Fulkerson_algorithm
Complete generalization of HVAC topology tracing

Partially reverse implemenation of Ford–Fulkerson algorithm in favor of  a more
simple depth first search. The old strategy contained notion of flow
capacity which is not required here.

This approach is only used by Loop::demandComponents but could be
applied to all HVAC system tracing. Now Loop::demandComponents is
sophisticated enough to trace systems that contain plenums (splitters on
splitters) and plenum related unit tests now pass.
Implement AirLoopHVACSupplyPlenum::addBranchForZone

Also update AirLoopHVAC::addBranchForZone to consider the existence of
plenums.  If there is one supply plenum and/or one return plenum and all
zones are between those plenums, then AirLoopHVAC::addBranchForZone will
add new zone to existing plenums.  If this criteria is not met
AirLoopHVAC::addBranchForZone will add a new branch to the main zone
splitter/mixer and add the new zone to that branch.

Factored out addBranchForZone into private function that is shared by
AirLoopHVAC::addBranchForZone and
AirLoopHVACSupplyPlenum::addBranchForZone.

Added unit tests to verify all of this new stuff.
Update AirLoopHVAC::removeBranchForZone

This work makes AirLoopHVAC::removeBranchForZone plenum aware and
capable of removing zone branches involving plenums.
Overload AirLoopHVACSupplyPlenum::addBranchForZone

created  bool addBranchForZone(ThermalZone & thermalZone,
                               StraightComponent & terminal);
Add AirLoopHVACReturnPlenum::addBranchForZone

Also improve code reuse for AirLoopHVACSupplyPlenum::addBranchForZone in
the overloaded versions.
Add ForwardTranslateAirLoopHVACSupplyPlenum
Add ForwardTranslateAirLoopHVACReturnPlenum
Create supply and return paths with plenums
Translate plenum branches
Fix runtime crash osm-idf translator

When creating supply and return paths, translator was using incorrect
node name after developing plenum support.
Fix miscellaneous errors related to plenums

This is a collection of bug fixes that result in functioning plenum
support with clean simulations.  Included in these bug fixes are the
following:

In ForwardTranslateAirLoopHVACReturnPlenum and
ForwardTranslateAirLoopHVACSupplyPlenum, fix issue where wrong node name
is used for inlet/outlet nodes.

In AirLoopHVACSupplyPlenum fix issue in overloaded addBranchForZone that
can cause infinite recursion.

In all AirTerminal classes, relax logic in ::addToNode to use base
Splitter / Mixer type instead of the more specific
AirLoopHVACZoneSplitter/Mixer.  This allows ::addToNode to function
properly between plenums.  This error was not captured by unit tests,
but resulted in simulation errors.  Similar addToNode logic is present
in all air terminal classes and this would be a good area to factor a
base class and remove this code duplication in the future.

In ModelHVAC.i, reorder class registration to properly capture base type
of plenums.
Enhance plenum API to restrict bad things

Restrict plenum API so that a plenum zone cannot be conditioned with
equipment or AirLoopHVAC.  Add documentation to explain (some) of the
rules.
Implement AirLoopHVACSupplyPlenum::remove

This will remove the plenum intelligently reconnecting all of its branches to the main
zone splitter.

Also improved const correctness wwith respect to
ThermalZone::equipment.