Refactor ColdSignal initialization and subscription APIs

Resolves #1587.

Although slightly more verbose, I think this simplifies the components, and makes synchronous handling part of the _normal_ case, rather than the exceptional case.