Dims

@rizar So here's my alternative for dealing with `dims`, forgot to actually create the PR yesterday (this one does support lazy initialization by the way).

Another change which I can factor out if needed: We should probably stop using

```python
self.__dict__.update(locals())
```

because it circumvents calling property setters

```python
class SomeBrick(Brick):
    def __init__(self, dim):
        self.__dict__.update(locals())

    @property
    def dim(self):
        return self._dim

    @dim.setter
    def dim(self, value):
        self._dim = value

some_brick = SomeBrick(5)
some_brick.dim  # Raises an AttributeError
```