Basic signal that supports arbitrary listeners.
While this class can be used directly it is best used with the helper decorator Signal.define on a member function. The function body is ignored, apart from the documentation.
The function name then becomes a unique (per encapsulating class instance) object (an instance of this Signal class) that is created on demand.
In practice you just have a documentation and use object.signal_name.connect() and object.signal_name(*args, **kwargs) to fire it.
Connect a new listener to this signal
That listener will be called whenever fire() is invoked on the signal