Don't ever process callbacks in a reentrant fashion; once we start processing a promises's callbacks, always finish the currently-executing callback before moving on to the next.
Verify that assert. methods are given the right number of arguments.  Rename hasKey to hasProperty and notHasKey to notHasProperty