Cleanup permalink generation

Fix permalink generation to not contain various smells. See verbose description in the last commit in this PR.
I would suggest moving this into `attr_reader` and not using `@options` within the object.

In general I think storing `@options` and passing it around in the object is an anti-pattern, and prefer it be unwrapped and validated in the initializer, and we access specific named attributes of the object instead.