I think text properties are what you are seeking. The Elisp info file even includes an entry on "Clickable Text", Text -> Text Properties -> Clickable Text. That section actually includes a pretty detailed example on how to achieve just the sort of thing you mention.