KT-4569: Intention to simplify boolean expressions with constants

Intention to simplify boolean expressions with constants in them,
issue: KT-4569 (http://youtrack.jetbrains.com/issue/KT-4569)

I used some helper functions, I didn't know if the convention is to nest them inside the functions they're helping or not but when I looked at some other code it seemed that we just have them as private functions in the class so that's what I did

<b>Parentheses handling:</b>
if the binary expression has parentheses in it, and they don't contain any constants, they are kept as to not change what the user wanted to write
 - example: false || x || (y && z) -> x || (y && z)

if the parentheses have constants in them and so the inner expression is changed, I will remove the parentheses only if there's only one element left: (that is again to keep the user's original intent)
 - example 1: x || (y && true) -> x || y
 - example 2: x || (y && z && true) -> x || (y && z)

if at the end of the evaluation the entire expression has parentheses around it, they will be removed:
 - example: false || (x && y) -> x && y