Added a StormUtils function to turn any string into a string that is acceptable as a Storm Bolt, Spout, Stream or Topology name.  This has then been used wherever appropriate in the existing Storm Builders
Reorganised the behaviour of Streams, introducing an abstract class, DirectedEdge, to represent the behaviour on the level of DGNodes and DirectedGraphs.  This makes the EDGE generics a bounded generic, in that EDGE extends DirectedEdge.

DirectedEdges have one OR MORE sources and one OR MORE destinations.  DGNodes no longer connect directly to other nodes, but to incoming and outgoing edges.  In this way, a the semantics of many-publisher, many-subscriber streams can be most intuitively implemented.  The NamedNodeComponent.constructStreamName still allows the construction of unique stream names within the topology (not necessary, but potentially useful) by prepending the specific source and destination being connected by a given Storm Stream.
Updated the NamedNodeComponent static method constructStreamName() to include the StormUtils static method legalizeStormIdentifier() as it constructs an identifier for use specifically in Storm.  The (now duplicate) calls to legalizeStormIdentifier() in the NamedNodeComponent and Storm Builder have also been removed.