Change permalink validation and substitution.

Fixes #577.

- Uses `regexp` to match against attribute patterns, permitting `/:year-:month/` as a valid path.

Note that this change __may not go far enough__. Once we’re using `regexp.Regexp.FindAllStringSubmatches`, there’s no good reason to split on `/` except to verify that there’s not an empty path portion (`//`).

It’s also a little less efficient than it might otherwise be in that using `strings.Replace(s, old, new, -1)` would replace all forms of a string at once rather than `strings.Replace(s, old, new, 1)` replacing them one-by-one (and a callback being executed). With both this code and the current approach, a permalink of `/:title/:title` will result in the `title` callback being called twice, even though the title will not have changed between calls.