Add a dictionary variation of layout and constrain functions.

This fixes #43.

I'm conflicted about weather or not we should remove the `Array` based versions now that we have a `Dictionary` version. On one hand we should keep the `Array` version as it is:
* More Succinct
* Doesn't return an optional when accessing the value, while `Dictionary` does.
* Doesn't break the API

On the other hand:
* The public API grows.
* The intent of both the `Array` and `Dictionary` based versions are essentially the same. Meaning that as it stands now we are solving the same problem in two different ways, which is concerning.

One more thing, I decided to target the refactor branch because I thought the implementation might change dramatically between refactor and master (turns out, that it didn't really matter), and because it's the branch that I'm using.
Let's make this `layout<T: Equatable, Hashable>(views: [T: View], block:([T: LayoutProxy] -> ()))` so users can use arbitrary identifiers (tags, strings, even the views themselves)