Implemented Keyword Substitution feature

@jrbl @jinpa 

![screen shot 2014-07-18 at 4 02 35 pm](https://cloud.githubusercontent.com/assets/3598201/3632888/a5fc93d8-0ecf-11e4-8154-69c818781e70.png)
![screen shot 2014-07-18 at 4 02 11 pm](https://cloud.githubusercontent.com/assets/3598201/3632889/a5fca044-0ecf-11e4-9238-d42c842bf8c3.png)

With this commit, instructors can include keywords in their bulk emails and
announcments that will be automatically substituted to the corresponding value
in the database. This commit introduces: %%USER_ID%% => anonymous_user_id and
%%USER_NAMR%% => user profile name.

This substitution in done by common/djangoapps/util/keyword_substitution.py. It
has a map between keywords and functions that will be called on the original
string (html document), and replace each keyword with the return value of the
function. In order to add more keyword substitutions, we can just add
"%%keywords%%" and their function mappings to the map in the future.

In the future, we can use this module to introduce keyword substitution feature
in other places.

** Since this feature deals with anonymous user ids, it's dependent on: 
https://github.com/edx/edx-platform/pull/4485
Can you explain why you needed to do this? I have a number of concerns about it:

* What case arose that required adding this check?  Anonymous student ids are already in wide use.  Is this related to keyword substitution?  We have a number of active community members using non-ASCII data for everything, I'm surprised this hasn't arisen yet.

* In is_ascii_string, you use .decode, which would be appropriate for a bytestring, but here you use .encode, which is only for Unicode strings.  What type is course_id_string?

* Even if we need this conversion, it's simpler just to always encode to utf8 than to check first.