Producer.publish takes a third parameter, options: PublishOptions | None = None; custom producers must accept it (they may ignore it).
the store is no longer registered in app.hooks (before_startup and after_shutdown start empty), after_shutdown hooks now run before the store stops, and they no longer run when startup fails. Runner subclasses must implement _serve().
every asynk exception now lives in asynk.errors, is exported from asynk and derives from AsynkError only; NotConfiguredError is no longer a RuntimeError, TaskNotFoundError no longer a LookupError, and CronError, DecodeError, EncodeError and InvalidEnvelopeError no longer ValueErrors. The old module paths (asynk.app, asynk.codec, asynk.hooks, ...) no longer provide them. TaskFailedError is renamed DeliveryFailedError.
before_task, after_task, BeforeTaskHook, AfterTaskHook and SkipTask are removed; use @app.middleware and TaskCall.skip(). A layer that raises after the task ran is logged and no longer redelivers.
require Python 3.11
hooks: dedupe hooks by object instead of module.qualname
remove the unix socket transport and SqliteStore
scheduler: release the slot claim when the publish fails, and add Store.delete (#44)