Cancel() in callback now takes an optional error, fixes #5