Deep Learning for Source Code Modeling and Generation: Models, Applications and Challenges