Reading over this, it looks like the support for a number of the cards is not really right. For example, with Cellar you have to discard all N cards at once, and then draw N replacements, rather than doing a discard/draw pair N times. That one's easy enough for me to fix, and I'll probably send over a pull request soonish. But some of them run into more fundamental problems, mostly that of an opponent making a choice mid-turn: eg, Militia's current "you must discard the cheapest cards" behavior is obviously wrong. Bureaucrat is more subtly wrong, because there are very few scenarios in base where it matters which card you put back, so not offering a choice isn't so bad; but for example I might have a Remodel in hand, and need to keep the Province to end the game next turn, rather than keeping my useless Estate.
It looks like you forgot to finish Moat: apparently at the moment it only works against Bureaucrat, and no other attacks. There's the same problem of mid-turn choices, of course: mostly I'm happy to block an attack, but maybe I want to accept the Curse from Witch so as to empty the third pile sooner, or let you Thief away one of my Coppers.
I briefly tried to write my own Dominion engine in Haskell, but I still only really dabble in Haskell, and I gave up when I couldn't figure out how to model the many choices that have to be made, especially with reaction cards. I like your "followup" model, and it handles a lot of the issues, but there are still a lot of things left that I don't know how to handle and it looks like you haven't planned for (cards in other expansions, mostly).