Interfaces, code cleanup, and coverage, oh my!

Some commits that mainly involve removing some flab from playd, separating some classes into interface/implementation classes to allow the implementations to be dummied in testing, and implementing a few new tests that make use of those dummies.

Passes its tests, but one may need to run playd on actual audio to make sure nothing has broken.