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
Added OS:Fan:ZoneExhaust to IDD.  Kyle, I'm not totally sure about the System Availability Manager Coupling Mode Field.  I kept it for now.  I didn't build yet.  I will do that now after commit.
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.
Adjust thermostat translation

Removed thermostats from the idd object types to translate because thermostats
will be explicitly translated within translateThermalZone.
This removes any possibilty of orphan thermostats ending up in
the idf file.

[#63470904]
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);
Adding helpers for measure output. [#64247570]
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.