String constraint solving: Past, present and future