add ability to "shallow-copy" graph components, which is required to implement the SFG constructor
redesign Port/OutputPort/InputPort interface to simplify implementation and make it easier to implement operator overloading for connecting signals (only InputPort has a connect method)
update logic between Signal constructor/set_source/set_detination and InputPort.connect/add_signal/remove_signal, etc.
add SignalSourceProvider interface for Operation and OutputPort that forces AbstractOperation to implement a method that provides its "main" signal source if available, making it possible to pass either an OutputPort or Operation as a signal source to various operation constructors
implement SFG constructor according to the current class diagram
fix order of methods in various classes to match class diagram
fix order of constructor arguments in InputPort/OutputPort to match class diagram
move input source connection code from concrete operations to AbstractOperation to reduce boilerplate in user-defined operations
use the public interface of base classes in derived classes instead of relying on implementation details for operations
change param name from "coefficient" to "value" in some core operations
add some tests for SFG construction
fix some small typos/style errors in comments and syntax
fix some tests relying on AssertionError being raised, rather than any Exception
change Signal.is_connected to Signal.dangling to match class diagram
update implementation of AbstractOperation.split() and AbstractOperation.evaluate_output()
add implementation of evaluate() and evaluate_output() to sfg (needs testing)