Context-Aware optimization in heterogeneous networks: handover and caching strategies