Fix logical problems in MGConstrainedDoFs and rewrite step 16

MGConstrainedDoFs had a constructor that could result in an inconsistent state. Furthermore, it assumed Dirichlet boundary only. Timo and I reorganized the class, removed part of its data, and made sure that it does what it promises.

In this process, in order to remove deprecated functions in the future, and also in preparation for parallel multigrid, step 16 was changed to use MeshWorker.

Some tests needed minor changes, but their outputs have been verified.
I will admit that I have difficulty understanding what the code does (and the comments doesn't help much either). What do the following things refer to (and what do their arguments stand for):
- dinfo.matrix(0,false).matrix
- info.fe_values(0)
- dinfo.n_vectors()
- dinfo.vector(0).block(0)

Could there be more than one vector? I assume n_vectors()>0 really means "there is a vector, which implies that we currently do the global system, not a level system", right?