`b` get a callback function after `a.callback(3)`. By checking the source code( https://github.com/twisted/twisted/blob/twisted-18.7.0/src/twisted/internet/defer.py#L438
). It seems that `b` is appended an "a is waiting for b to fire" callback. Chain would stop here since function `b_callback` return deferred `b`, and `b` would be the result of `a`. Note: if result is a value instead of a deferred object, chain will continue.
`b.callback(4)` passes `4` to `a`'s next callback as an argument. `b` get a `None` as a result. The chain continues.