What is the difference between val and const val in Kotlin, and how does the compiler handle them differently?