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 
I came across a case where if Watir.always_locate was false, so the element was never re-evaluated. The cached element existed and was not stale, but was also not visible. Setting @element = nil clears the cache and forces a re-lookup. If we want the element to be present and it isn't, we're going to keep querying for it, which means it makes no sense to keep using the cached object.