Do we have a way to detect the modifier state from the Lisp level,
or bind
commands to modifier state changes?
No.
I did some simple experiments with it, in order to get events like
<control> and <down-control> (which actually were <down-control> and
<C-control> because when the release event is received, the modifier
state is not yet cleared). I did get it to work OK without too much
trouble (mostly I had to add some function-key-map entries to drop
those
events when not bound, and I had to rework C-q so that it waits for
a "real" key press rather than stopping at the <down-control>), but
haven't investigated much further.