What are the differences between var, let, and const in JavaScript, particularly regarding scope and hoisting?