Switch from having a DSL centric API to use plain Elixir data structures
Merge with master