fixed set_tag bugs, added wait_until_terminated

there were some bugs in the way that tags were set such that on destroy,
if the instance didn't exist it would still try to set a tag and thus
generate a cascading exception

Also fixed a design error in the destroy() method. destroy() now waits
until the instance enters the terminated state. Previous to this, any
other resources that expected this instance to be destroyed would fail
as destroy returned before the instance had exited 'shutting-down'