Improve Signal's memory management

Two major changes to #1382:

 1. A `Signal` can now be kept alive _either_ with a direct reference, or by holding on to the `Disposable` returned from `observe()`—before, only the former worked.
 1. `Signal.buffer()` properly retains the signal for at least as long as the returned `Producer` is alive.

Also fixed a bug in `buffer()` that caused the given capacity to erroneously refer to a number of _events_ instead of _values_.