Fix race condition when button removed before bound promise finishes

I found a race condition when using ```async-button``` with a bound promise inside an if statement that turns false after promise has been assigned to the component and before the promise is resolved.

This PR fixes it.

It also includes a refactoring of one of the tests and tests from async-button using a bound promise.