Is there an app that can save dual-display window states and automatically save/restore them when I disconnect/reconnect the dual display?
I do use Stay and am happy with it :) 

But I also use another app that I really like called Slate ( https://github.com/jigish/slate ). Slate is open source (and free), and does allow to define things like Stay (profiles: layouts of windows - which I think will fit your needs), but also allow move windows with keys combinations, and many other interesting things... 

I also have dual display setups and managed to get things working fine with Stay. I have 3 setups two in dual display and one without external display and it works just fine, restoring the windows to their positions when I connect a particular profile (I previously configured... I had to create some simple rules). I use Slate for moving windows around with the keyboard... I think it is a good combination :p

Cheers!