CLN: share compatibility-check code
> what is the advantage of having raise_on_incompatible return an exception, just to always raise it?

Among other things, mypy has an easier time telling that we have raised.  This is also the pattern we've moved to in Index AFAIK you could just type the function as `NoReturn` (though maybe not available until 3.6.4)

No preference on my end between raise and return so lgtm ok thanks