1 - Yes, this is done with the .GetLightsCollisionAt() function. It returns the pixel color at the specified position, and with that, you can use color_get_value() to obtain the brightness of the color and thus create gameplay mechanics.
2 - Lights are objects, so you can do this without relying on Crystal; Crystal only provides the function of detecting the color of the light at that position.
3 - Yes, but you would have to create a shader that darkens the object's sprite according to the light's position. Since the lighting system is 2D, and the sprites are simple quads with two ultra-thin triangles, that's why there's such a drastic change when altering the light's depth.
4 - Yes, see: How to have any layer or graphic unlit (without being affected by lights)