WL-3119 Ensure a event creator is defined

This ensures that an attendee gets assigned to the event, if this doesn't
happen the calendar will be invalid because it uses the `method=REQUEST`.

Infuriatingly the setCreator method on an event takes no parameters and
will assign the current user. This is not necessarily the creator of the
event.

Fortunately the event exposes its properties so we can just fiddle with
them directly. What could go wrong?
WL-3119 Define MIME headers on Attachment

Use the new constructor in the kernel for Attachment that allows you
to specify the MIME headers, namely the `Content-Type` and
`Content-Disposition`.

This is important so that we can get the email client to recognise
that this is a calendar invite and we would like to display it as an
inline meeting request.

This is tied to a change in the kernel. Locally commit 34ae2f134e.
WL-3119 Set flag for multipart subtype

The Signup email façade needs to tell the `BasicEmailService` that the
message should have a different MIME multipart subtype because it is a
meeting invite.

A mechanism was introduce to the kernel in 27fee06f1a48965f

This involves adding the flag called `multipart-subtype` as one of the
'additional headers'. We sneak it in this way because the existing API
is quite restrictive and this will fail silently if it is not implemented
in the currently running version of kernel.
WL-3119 Get a list of coordinators

DRY out logic to convert the `coordinatorIds` string for a meeting to a
list of id strings. This is now a public method of `SignupMeeting`.

The awkward name `getCoordinatorIdsList` is to prevent it from conflicting
with the existing getter which is defined through lombok.
WL-3119 Calendars, meet Users

Added a UserDirectoryService to the SignupCalendarHelper.

The aim is to add chair participants to the events for a meeting.

The alternative would be to do the user processing in the EmailFacade but
this logic is really to do with calendars, not emails.
WL-3119 Meeting coordinators chair meetings

Meeting coordinators are added to the meeting event as chair participants.

Relies on the ExternalCalendaringService API being extended to define this
specific role. Normally participants are added as 'required participants'.

I was going to define something similar for the attendees but this would
be a privacy concern. Better to add them later in the EmailFacade when the
recipient is known.
WL-3119 Calendar constructor with method

Pass through the new Calendar constructor in the exeternal calendering
service api which allows an iTIP method to be specified such as `REQUEST`
or `CANCEL`.
WL-3119 Use iTIP methods

Specify in the iCal attachment and its MIME type what kind of purpose the
iCal message serves.

There are generally three cases with the following methods used:

1. A new signup - `REQUEST`
2. A modified signup - `REQUEST`
3. A cancelled signup - `CANCEL`

For `CANCEL` requests it is important to make sure that attendees get
assigned.
WL-3119 Events have attendees

Make sure that events sent out by signup have attendees (especially when
they use the `REQUEST` method).

In particular, assign the organiser and coordinators as meeting chairs,
and when relevant assign the attendee too.
WL-3119 Add some docs to the CalendarHelper

Some of the methods in the Calendar were missing return values.
WL-3119 Get users from SakaiFacade

Instead of accessing sakai code directly, do it through the SakiaFacade.
Merge pull request #20 from ox-it/WL-3119

WL-3119 Ensure a event creator is defined