This forces us to use an explicit hash class in a few place, but it is cleaner. remove utils::lower_bound and utils::upper_bound, which were not used.
fixed a couple actual real bugs (missing returns in operator=, wrong implicit bool conversion). mostly added a bunch of explicit ctor.