Refactor `build_from_hash` to convert dot notation to hash first

This ensures that we're handling all forms of nested tables the same way.

We're aware that the `convert_dot_notation_to_hash` method will cause a
performance hit, and we intend to come back to it once we've refactored some of
the surrounding code.

[Melissa Xie & Melanie Gilman]
Could extract `EMPTY_PREDICATE = ["1=0"].freeze` to save on object allocation each time.