Ok, gotcha. That's very clear.

I would lean towards saying it's the library user's responsibility to pass in a function that calls its callback asynchronously. In other words, they are responsible for releasing the Zalgo in their code, and we are responsible in our code. Of course, we should document this behavior.

I can also think of an argument for programming defensively, accepting "async" functions that call the callback synchronously and calling setImmediate to make their usage async.