added Future.iferror to handle exceptions, return self from then() to chain easily