A mutable Signal object can report changes to its state, clients could register functions so that they are called whenever the signal is emited. The signal could be emited, disconnected, blocked, unblocked, and buffered.
copied from cf-staging / r-objectsignals