Instead of storing a vptr in each FoldingSet instance, form an
equivalent struct and pass it implicitly from FoldingSet into the
various FoldingSetBase methods.
This has three benefits:
- FoldingSet becomes one pointer smaller.
- Under LTO, the "virtual" functions are much easier to inline.
- The element type no longer needs to be complete when instantiating FoldingSet<T>, only when instantiating an insert / lookup member.
final seems a bit superfluous now that it is not dynamic.