Introduce Font and FontVariationDescription

*Ready to deploy.* This pull request is an internal rewrite of how font (family) names and font variation descriptions are passed around. Currently this is done using a pair of font family names and an object containing font family names and descriptions. This pull request introduces a Font class that contains FontVariationDescription instances. This will reduce the number of parameters passed around, makes type annotations easier to read and creates a central place to manipulate fonts and font variations.