Programming Models for Emerging Non-Volatile Memory Technologies