What are the core principles of FP that JavaScript developers can use to make more understandable and reason-able code?