Fix with-contract when the contracted identifier is defined as syntax.
Look for defines and handle them directly.

Since keyword definitions expand into multiple defines, and inserting
the contract and external id definitions at the wrong point will cause
those to break, we handle define manually.

Hat-tip to Vincent for the idea.

Doing this means that we can't put a single splicing-syntax-parameterize
around the entire body, since it'll expand defines before we reach them,
so instead we add them around the expanded code.
Tests for define/contract and keyword interaction.