This is precisely what Zope interfaces can be used for ;)

You can programatically verify implementation of interfaces even if the users don't explicitly declare them:
https://gist.github.com/txels/5019775

This may give us the best of both worlds, our users need not explicitly declare interfaces (although they are free to use them as a tool to check for compliance). Internally we can use them to formally document and verify plugins.