clean up do_set, including fixing lack of protection bug when lhs is a symbol