WIP-MEI: No longer re-assign the "m21Attr" dict after each preprocessor call

All the preprocessing functions return the "m21Attr" dict, but since they all
use the same dict, and they use it in order, there's no particular need to
re-assign the return value.
WIP-MEI: Tests: Add tests for _ppBeams() (beam preprocessing)
WIP-MEI: Tests: add a warning when <tie> doesn't have @startid and @endid

Previously, these ties would fail importing without a notice to the user. Now,
at least the user will be informed of this failure.
WIP-MEI: Tests: add a warning when <slur> doesn't have @startid and @endid

As with ties, users will now be informed when a <slur> element doesn't have
enough information for us to import it properly.
WIP-MEI: Tests: add a warning when <beamSpan> doesn't have @startid and @endid

As with previous commit, this means a <beamSpan> that specifies its beam in a
way we don't yet support will produce a warning for the user, and not just
silently fail.
WIP-MEI: Tests: add a warning when a <tupletSpan> is missing required info

<tupletSpan> requires either @startid and @endid or @plist in order to properly
figure out (or try to figure out) all the notes/chords/rests involved in the a
tuplet. Now there's a warning when that information isn't present. Hopefully we
can implement additional attributes in the future.
WIP-MEI: Tests: Add tests for _ppTuplets() (tuplet preprocessing)
WIP-MEI: New strategy for tuplets (part 1)

I'm rewriting the tuplet-guessing algorithm, moving it to music21 from the
ElementTree library. It'll be more correct and possibly faster. This is just
a helper function, but the rest is on its way...
WIP-MEI: New strategy for tuplets (part 2)

This is the rest of the code required to make it work, but this stuff is all
untested. Unlike with the previous strategy, this one may actually be
test-able.