Intelligent waits for when attempting to interact with an element

This mostly removes the need for WhenPresent calls.
assert_exists is kept the same for #exists? method
it is changed to wait_for_exists for interactions that do not throw exceptions when element is not displayed (they might return empty strings or null values)
it is changed to wait_for_present for all interactions that will throw an exception if not displayed 
There was an issue with this in #wait_for_visible. I put it here as well, but it might not be necessary.