fixes #1, #2; return thenable when no callback provided