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.
At this time, it isn't clear what "integration_loop" refers to (is it a local function, one from deal.II, etc?) but you can avoid the ambiguity if you say something like

"In this program, we will use the MeshWorker framework to do the integration of matrices. It's main component is a function MeshWorker::integration_loop() that expects a class that provides functions for integration on cells and boundary and interior faces. (For details on the MeshWorker framework, take a look at step-12 and the integrators provided there.)"