This is represented as an ADT consisting of two constructors, AnySourceMulticastJoin and
SourceSpecificMulticastJoin. These constructors are provided as top level types to allow domain modeling where a
specific join type is required. The address type is parameterized for a similar reason -- to allow domain modeling
where a specific address type is required.
Returns the source address and group address. If this join is an any-source join, None is returned for the
source. Otherwise, this join is a source specific join and Some(src) is returned for the source.
Returns the source address and group address. If this join is an any-source join, None is returned for the
source. Otherwise, this join is a source specific join and Some(src) is returned for the source.