A Formalised, Taxonomy-Driven Approach to Cross-Layer Application Adaptation