Apply Rule of Zero to BitSet and BitVector (#690)
- `utility::BitSet<B>` and `utility::BitVector<B>` each had only a
single value-type member (`std::set<B>` and `std::vector<bool>`
respectively), no user-declared copy/move/assignment operators, and an
explicit empty destructor.
- The empty `~BitSet() {}` / `~BitVector() {}` did nothing the
compiler-generated destructor wouldn't have done, and they suppressed
the implicit move constructor and move assignment.
- Remove the empty destructors so both class templates follow the Rule
of Zero and gain implicit move support.