catch exceptions in callbacks and act accordingly
some stuff to ignore
$deferred->promise now returns a new promise every time