Heterogeneity in Distributed Embedded Systems: From Programming Paradigms to Testing