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 
We don't have an error for when an element exists, but is not visible and we try to interact with it. Object isn't Unknown, Disabled or ReadOnly. I'd also like to throw this error for the Chrome "Element is not clickable at point" error, but that's a separate discussion.